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) :

  • Python: Wie bekomme ich die Länge von itertools _grouper
  • Mit itertools.product und wollen einen Wert säen
  • Paralelliere Schleife über iter
  • Gruppieren Sie aufeinanderfolgende ganze Zahlen und tolerieren Sie Lücken von 1
  • Itertools Zyklus in vigenere Chiffre verursacht Probleme mit Räumen python
  • Warum bekomme ich einen MemoryError mit itertools.product?
  •  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?

  • Delegierte in Python
  • Wie man eine Klasse automatisch registriert, wenn sie definiert ist
  • Python JSON komplexe Objekte (unter Berücksichtigung der Unterklassen)
  • Python: Passing SequenceMatcher in difflib ein "autojunk = False" Flag liefert Fehler
  • Kann die Hauptschleife eines Programms aus der GUI verschoben werden?
  • Dynamische Methode Bindung mit Vererbung in Python
  • 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.