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

  • Wie lese ich zwei Zeilen in einem Daten aus derselben Spalte, um eine Kombination von Werten aus dieser Spalte zu erstellen?
  • Itertools Produkt beschleunigt
  • Itertools.product eliminiert wiederholte Elemente
  • Python return Listen von kontinuierlichen Ganzzahlen aus der Liste
  • Wie kann man eine große Datendatei in Python streamen und manipulieren
  • Itertools Zyklus in vigenere Chiffre verursacht Probleme mit Räumen python
  •  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?

  • Vermeiden Sie das Befehlsmuster in Python
  • Delegierte in Python
  • Warum ist IoC / DI nicht in Python üblich?
  • Getter mit Nebenwirkung
  • Wende if-elseif-Anweisungen ins Wörterbuch
  • Python: Passing SequenceMatcher in difflib ein "autojunk = False" Flag liefert Fehler
  • 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.