2017-01-14 4 views
-1

Ich versuche geschachtelte Listen in Python zu gruppieren (ich habe die Daten bereits sortiert). Die endgültige Ausgabe sollte Komma getrennt Tupeln, eine pro ZeileVerschachtelte Listen in Tupel gruppieren

Aktuelle verschachtelte Liste:

[['A123', '2012-01-01', 'estrogen'], 
['A123', '2012-01-01', 'ibuprofen '], 
['A123', '2014-01-01', 'oxaliplatin'], 
['A123', '2014-01-01', 'penicilin']] 

Gewünschtes Ergebnis (Comma Separated Tupel)

[(('A123', '2012-01-01', 'estrogen'), 
    ('A123', '2012-01-01', 'ibuprofen ')), 
(('A123', '2014-01-01', 'oxaliplatin'), 
    ('A123', '2014-01-01', 'penicilin'))] 

ich die Sortierung verstehen, aber nicht ganz wissen, wie man die Listen zu einem zusammenfasst. Der letzte Schritt, den ich vermute, ist die Umwandlung in Tupel.

+1

Es gibt kein Komma-getrenntes Tupel. Ob es eins pro Zeile oder nicht ist, hängt davon ab, wie Sie es drucken. Bitte klären Sie, ob Sie eine Liste von Tupeln, ein Tupel von Tupeln oder etwas anderes konstruieren möchten. insbesondere ist nicht klar, warum die ersten zwei und die letzten zwei Tupel gruppiert sind. Sind sie nach Datum gruppiert? – DyZ

+0

Zitat von OP Frage: "Ich habe bereits die Daten sortiert". Sie müssen diese Informationen also nicht kennen. –

Antwort

0

Da Sie bereits Ihre Daten sortiert, können Sie die Listen zu Tupeln konvertieren und ein Tupel (Paar) von Tupeln 2 von 2 erstellen:

l = [['A123', '2012-01-01', 'estrogen'],['A123', '2012-01-01', 'ibuprofen'],['A123', '2014-01-01', 'oxaliplatin'], 
['A123', '2014-01-01', 'penicilin']] 

result = [(tuple(l[i]),tuple(l[i+1])) for i in range(0,len(l),2)] 
print(result) 

Variante mit zip und in Scheiben geschnittene Teillisten:

result = [(tuple(u),tuple(v)) for u,v in zip(l[::2],l[1::2])] 

Sie steuern nicht die Art, wie die Daten gedruckt werden, es sei denn, Sie verwenden pprint Modul.

import pprint 
pprint.pprint(result,width = 50) 

Da ich eine Breite von 50 gewählt haben, bekomme ich ein Element pro Zeile (abhängig von den Daten, aber es scheint, dass es genau die Ausgabe in Ihrer Frage erwähnt liefert, horizontale Ausrichtung enthalten)

[(('A123', '2012-01-01', 'estrogen'), 
    ('A123', '2012-01-01', 'ibuprofen')), 
(('A123', '2014-01-01', 'oxaliplatin'), 
    ('A123', '2014-01-01', 'penicilin'))] 
+0

Danke, das hat perfekt funktioniert! –

+0

okay, aber möchten Sie 2 durch 2 oder nach Code/Datum gruppieren? Denn wenn es Letzteres ist, ist die andere Antwort diejenige. –

+0

Die verschachtelten Listen sind bereits nach Code und Datum sortiert: list.sort (sampledata, key = itemgetter (0,1,2)) Die Ausgabe ist erforderlich, damit jedes Paar als kommasepariertes Tupel zurückgegeben wird. eine pro Zeile. Wenn das Sinn macht. Ihr Code funktioniert und ist einstellbar, wenn es sich zum Beispiel um Triplets oder Single handelt. –

0

Dies sieht aus wie ein Fall für itertools.groupby:

>>> data = [['A123', '2012-01-01', 'estrogen'], 
... ['A123', '2012-01-01', 'ibuprofen '], 
... ['A123', '2014-01-01', 'oxaliplatin'], 
... ['A123', '2014-01-01', 'penicilin']] 
>>> [tuple(grp) for key, grp in itertools.groupby(data, key=lambda x: x[:2])] 
[(['A123', '2012-01-01', 'estrogen'], ['A123', '2012-01-01', 'ibuprofen ']), 
(['A123', '2014-01-01', 'oxaliplatin'], ['A123', '2014-01-01', 'penicilin'])] 

dieser Gruppe alle Elemente, die die gleichen ersten beiden Elemente (key=lambda x: x[:2]) zusammen in einem Tupel haben. Beachten Sie, dass die Daten nach dem Schlüssel sortiert werden müssen, damit dies funktioniert. Dies ist jedoch bereits der Fall.

Verwandte Themen