Sie eine OrderedDict zur Gruppe durch die erste Teilelement jedes Tupel die Elemente verwenden können:
myList=[(1,2),(1,3),(1,4),(1,5),(2,6),(2,7),(2,8),(3,9),(3,10)]
from collections import OrderedDict
od = OrderedDict()
for a,b in myList:
od.setdefault(a,[]).append(b)
print(list(od.values()))
[[2, 3, 4, 5], [6, 7, 8], [9, 10]]
Wenn Sie wirklich Tupeln wollen:
print(list(map(tuple,od.values())))
[(2, 3, 4, 5), (6, 7, 8), (9, 10)]
Wenn Sie nicht über die Reihenfolge scherte die Elemente erschienen und wollten nur die effizienteste Möglichkeit zur Gruppierung Sie könnten ein collections.defaultdict verwenden:
from collections import defaultdict
od = defaultdict(list)
for a,b in myList:
od[a].append(b)
print(list(od.values()))
Wenn Sie Ihre Daten, um nach Ihrem Eingabeb. also sind
Schließlich sortierte Sie einfach itertools.groupby zu einer Gruppe von dem ersten Teilelement aus jedem Tupel und extrahiert das zweite Element aus der gruppierten Tupel verwenden:
from itertools import groupby
from operator import itemgetter
print([tuple(t[1] for t in v) for k,v in groupby(myList,key=itemgetter(0))])
Ausgang:
[(2, 3, 4, 5), (6, 7, 8), (9, 10)]
Auch die groupby wird nur funktionieren, wenn Ihre Daten um mindestens das erste Element sortiert ist.
Einige Timings auf einer vernünftigen Größe Liste:
In [33]: myList = [(randint(1,10000),randint(1,10000)) for _ in range(100000)]
In [34]: myList.sort()
In [35]: timeit ([tuple(t[1] for t in v) for k,v in groupby(myList,key=itemgetter(0))])
10 loops, best of 3: 44.5 ms per loop
In [36]: %%timeit od = defaultdict(list)
for a,b in myList:
od[a].append(b)
....:
10 loops, best of 3: 33.8 ms per loop
In [37]: %%timeit
dictionary = OrderedDict()
for x, y in myList:
if x not in dictionary:
dictionary[x] = [] # new empty list
dictionary[x].append(y)
....:
10 loops, best of 3: 63.3 ms per loop
In [38]: %%timeit
od = OrderedDict()
for a,b in myList:
od.setdefault(a,[]).append(b)
....:
10 loops, best of 3: 80.3 ms per loop
Iforder Angelegenheiten und die Daten sortiert, gehen Sie mit dem groupby, wird es noch näher an den defaultdict Ansatz, wenn es notwendig ist, um alle Elemente dem Tupel im Standarddict zuzuordnen.
Wenn die Daten nicht sortiert sind oder Sie sich nicht um eine Bestellung kümmern, finden Sie keinen schnelleren Weg zur Gruppierung als mit der defaultdict Methode.
Was ist, wenn das erste Element einer Unter * Tupel * nicht üblich ist? Sie möchten ein Tupel aus einem einzelnen Element? –
Das ist keine Liste von Listen, sondern eine Liste von Tupeln; das macht keinen Unterschied für Ihre Frage, aber dennoch sollten Sie sich des Unterschieds bewusst sein –
Vielen Dank für die Korrektur. – PythonNoob