2017-04-13 2 views
2

Sagen wir, ich die folgende Liste der Listen von Tupeln haben:Liste der Listen von Tupeln, Gruppe durch erste Element und fügen Sie das zweite Element

tuples = [ 
      [ 
       ('2017-04-11', '2000000.00'), 
       ('2017-04-12', '1000000.00'), 
       ('2017-04-13', '3000000.00') 
      ], 
      [ 
       ('2017-04-12', '472943.00'), 
       ('2017-04-13', '1000000.00') 
      ] 
      # ... 
     ] 

Wie würde ich über gehen Gruppierung sie aus der Basis des ersten Elements (Datum) und das andere Element hinzufügen.

Zum Beispiel würde ich so etwas wie dies mag:

tuples = [('2017-04-11', '2000000.00'), ('2017-04-12', '1472943.00'), ('2017-04-13', '4000000.00')], 
+0

So haben Sie Ihre Eingabe und Ihr erwartetes Ergebnis verbucht. Aber wo ist Ihr Ansatz, um das Problem selbst zu lösen? Bitte posten Sie Ihren Code und teilen Sie uns mit, wo Sie stecken geblieben sind. –

+0

Durch die erwartete Ausgabe konnte nicht klar verstanden werden. Aber: Machen Sie Gruppenidentität als Schlüssel und erstellen Sie daraus ein Wörterbuch. '{" Gruppenidentität ", [Ihre-Liste-oben-erwähnt]}}. Erstellen Sie Daten in diesem Format mit Python. Ist das wonach Sie suchen? – Haranadh

+0

Ich habe eine Frage gestellt, weil ich zahlreiche Lösungen ausprobiert habe und es nicht zum Laufen gebracht habe. Ich habe versucht Karte, itertools.izip_longest ohne Glück @ mpf82 –

Antwort

3

Die Lösung mit itertools.chain.from_iterable, itertools.groupby und sum Funktionen:

import itertools, operator 

tuples = [ 
     [('2017-04-11', '2000000.00'), ('2017-04-12', '1000000.00'), ('2017-04-13', '3000000.00')], 
     [('2017-04-12', '472943.00'), ('2017-04-13', '1000000.00')] 
     ] 

result = [(k, "%.2f" % sum(float(t[1]) for t in g)) 
      for k,g in itertools.groupby(sorted(itertools.chain.from_iterable(tuples)), operator.itemgetter(0))] 

print(result) 

Der Ausgang:

[('2017-04-11', '2000000.00'), ('2017-04-12', '1472943.00'), ('2017-04-13', '4000000.00')] 
0

Mein Weg besteht darin, die geschachtelte Liste in eine flache Liste zu konvertieren und sie zu wiederholen:

t = [ 
     [('2017-04-11', '2000000.00'), ('2017-04-12', '1000000.00'), ('2017-04-13', '3000000.00')], 
     [('2017-04-12', '472943.00'), ('2017-04-13', '1000000.00')] 
     ] 
a={} 

for i,j in sum(t,[]): 
    a[i]=a[i]+float(j) if i in a else float(j) 

print(a) 

Ausgang:

{'2017-04-11': 2000000.0, '2017-04-13': 4000000.0, '2017-04-12': 1472943.0} 

Wenn Sie eine Liste möchten, können Sie verwenden [(k,v) for k,v in a.items()])

0

die Liste Abflachen dann mit defaultdict:

from collections import defaultdict 

flattened_tuples = [item for sublist in tuples for item in sublist] 

result = defaultdict(float) 
for date, value in flattened_tuples: 
    result[date] += float(value) 
print(result) 

kehrt {'2017-04-11': 2000000.0, '2017-04-12': 1472943.0, '2017-04-13': 4000000.0}

1

Zuerst Wohnung eine Liste von Tupeln aus einer Liste von Listen von Tupeln und dann itertools.groupby verwenden,

import itertools 
import operator 

lists = [ 
     [('2017-04-11', '2000000.00'), ('2017-04-12', '1000000.00'), ('2017-04-13', '3000000.00')], 
     [('2017-04-12', '472943.00'), ('2017-04-13', '1000000.00')] 
     ] 

# Step 1: Flat a list of tuples out of a list of lists of tuples 
list_tuples = [t for sublist in lists for t in sublist] 
''' 
[('2017-04-11', '2000000.00'), ('2017-04-12', '1000000.00'), ('2017-04-13', '3000000.00'), ('2017-04-12', '472943.00'), ('2017-04-13', '1000000.00')] 
''' 

# Step 2: Groupby 
results = list() 

for key, group in itertools.groupby(sorted(list_tuples), operator.itemgetter(0)): 
    s = sum(float(t[1]) for t in group) 
    results.append((key, s)) 

print(results) 
#[('2017-04-11', 2000000.0), ('2017-04-12', 1472943.0), ('2017-04-13', 4000000.0)] 
Verwandte Themen