Gruppenliste der Tupel nach Artikel

Ich habe diese Liste als Beispiel:

[(148, Decimal('3.0')), (325, Decimal('3.0')), (148, Decimal('2.0')), (183, Decimal('1.0')), (308, Decimal('1.0')), (530, Decimal('1.0')), (594, Decimal('1.0')), (686, Decimal('1.0')), (756, Decimal('1.0')), (806, Decimal('1.0'))] 

Jetzt möchte ich gruppieren durch die ID, also werde ich itemgetter(0) :

  • Welcher itertools Generator überspringt keine Kombinationen?
  • Multiprocessing auf tee'd Generatoren
  • Alle möglichen Kombinationen einer beliebigen Anzahl von Arrays zusammenzufassen und Grenzen zu setzen und Indizes zurückzugeben
  • Numpy mit Kombinatorischen Generatoren: Wie beschleunigt man Kombinationen?
  • Pythonische Iteration über Schiebefensterpaare in der Liste?
  • Wann ist es besser, Zip statt izip zu benutzen?
  •  import operator, itertools from decimal import * test=[(148, Decimal('3.0')), (325, Decimal('3.0')), (148, Decimal('2.0')), (183, Decimal('1.0')), (308, Decimal('1.0')), (530, Decimal('1.0')), (594, Decimal('1.0')), (686, Decimal('1.0')), (756, Decimal('1.0')), (806, Decimal('1.0'))] for _k, data in itertools.groupby(test, operator.itemgetter(0)): print list(data) 

    Ich weiß nicht, warum, aber ich bekomme diese falsche Ausgabe:

     [(148, Decimal('3.0'))] [(325, Decimal('3.0'))] [(148, Decimal('2.0'))] [(183, Decimal('1.0'))] [(308, Decimal('1.0'))] [(530, Decimal('1.0'))] [(594, Decimal('1.0'))] [(686, Decimal('1.0'))] [(756, Decimal('1.0'))] [(806, Decimal('1.0'))] 

    Wie Sie sehen können, ist die Ausgabe nicht nach id gruppiert. Allerdings funktioniert der Code oben gut, wenn ich itemgetter(1) . Der Ausgang wird durch Dezimalwert gruppiert.

     [(148, Decimal('3.0')), (325, Decimal('3.0'))] [(148, Decimal('2.0'))] [(183, Decimal('1.0')), (308, Decimal('1.0')), (530, Decimal('1.0')), (594, Decimal('1.0')), (686, Decimal('1.0')), (756, Decimal('1.0')), (806, Decimal('1.0'))] 

    Was fehlt mir hier?

  • Gutes Design für die Veränderung der verschiedenen Kombination von Säulen in einer Tabelle
  • Auto-Register Klassen Methoden mit Dekorateur
  • Python JSON komplexe Objekte (unter Berücksichtigung der Unterklassen)
  • Singleton über Module
  • Wende if-elseif-Anweisungen ins Wörterbuch
  • Was ist der Unterschied zwischen Python-Dekorateuren und dem Dekorationsmuster?
  • 2 Solutions collect form web for “Gruppenliste der Tupel nach Artikel”

    Sie müssten zuerst die Daten für die Gruppe zu sortieren, um zu arbeiten, es gruppiert aufeinanderfolgende Elemente, die auf dem Schlüssel basieren, den Sie zur Verfügung stellen:

     import operator, itertools from decimal import * test=[(148, Decimal('3.0')), (325, Decimal('3.0')), (148, Decimal('2.0')), (183, Decimal('1.0')), (308, Decimal('1.0')), (530, Decimal('1.0')), (594, Decimal('1.0')), (686, Decimal('1.0')), (756, Decimal('1.0')), (806, Decimal('1.0'))] for _k, data in itertools.groupby(sorted(test), operator.itemgetter(0)): print list(data) 

    Aber du würdest es besser sein, einen Dict zu gruppieren, um eine unnötige O (n log n) Art zu vermeiden:

     from collections import defaultdict d = defaultdict(list) for t in test: d[t[0]].append(t) for v in d.values(): print(v) 

    Beide würden dir die gleichen Gruppierungen geben, einfach nicht unbedingt in der gleichen Reihenfolge.

    itertools.groupby() erfordert, dass die Daten konsistent oder sortiert sind.

    [(148, Decimal('3.0')), (148, Decimal('2.0')), (325, Decimal('3.0'))] funktioniert aber [(148, Decimal('3.0')), (325, Decimal('3.0')), (148, Decimal('2.0'))] wird nicht wie die ID 148, 325, 148 statt 148, 148, 325 .

    Python ist die beste Programmiersprache der Welt.