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

 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?

  • Warum ist Tupel größer als eine Liste in Python?
  • Deal mit Unicode-Benutzernamen in python mkdtemp
  • Python 2.7 Kombinieren Sie abcabstractmethod und classmethod
  • Nicht finden die Saiten erwartet mit pyparsing
  • Alternativen zu Selenium / Webdriver zum Ausfüllen von Feldern beim kratzfädeln mit Python?
  • Wie man eine for-Schleife in Batches ausführt?
  • Installiere django1.7 mit Python 3.4 mit virtualenv
  • Unerwarteter IndexError beim Entfernen von Listeneinträgen
  • 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.