Frage

Ich habe eine Liste von Tupeln wie folgt aus:

[
('a', 1),
('a', 2),
('a', 3),
('b', 1),
('b', 2),
('c', 1),
]

Ich möchte durch dieses Keying durch das erste Element zu durchlaufen, so zum Beispiel ich so etwas wie diese drucken könnte:

a 1 2 3
b 1 2
c 1

Wie würde ich über das tun dies gehen, ohne ein Element zu halten zu verfolgen, ob das erste Element das gleiche wie ich Schleife um die Tupel ist? Das fühlt sich ziemlich chaotisch (plus Ich habe die Liste zu sortieren, mit zu beginnen) ...

War es hilfreich?

Lösung

l = [
('a', 1),
('a', 2),
('a', 3),
('b', 1),
('b', 2),
('c', 1),
]

d = {}
for x, y in l:
    d.setdefault(x, []).append(y)
print d

erzeugt:

{'a': [1, 2, 3], 'c': [1], 'b': [1, 2]}

Andere Tipps

Ein wenig einfacher ...

>>> from collections import defaultdict
>>> fq= defaultdict( list )
>>> for n,v in myList:
        fq[n].append(v)

>>> fq
defaultdict(<type 'list'>, {'a': [1, 2, 3], 'c': [1], 'b': [1, 2]})

Eine Lösung mit groupby

    >>> from itertools import groupby
    >>> l = [('a',1), ('a', 2),('a', 3),('b', 1),('b', 2),('c', 1),]
    >>> [(label, [v for l,v in value]) for (label, value) in groupby(l, lambda x:x[0])]
    [('a', [1, 2, 3]), ('b', [1, 2]), ('c', [1])]

groupby (l, Lambda-x: x [0]) gibt einen Iterator, enthält [ 'a', [( 'a', 1), ...], c [( 'c', 1) ], ...]

Drucken Liste von Tupeln durch das erste Element Gruppierung

Diese Antwort basiert auf die @gommen ein .

#!/usr/bin/env python

from itertools import groupby
from operator  import itemgetter

L = [
('a', 1),
('a', 2),
('a', 3),
('b', 1),
('b', 2),
('c', 1),
]

key = itemgetter(0)
L.sort(key=key) #NOTE: use `L.sort()` if you'd like second items to be sorted too
for k, group in groupby(L, key=key):
    print k, ' '.join(str(item[1]) for item in group)

Ausgabe:

a 1 2 3
b 1 2
c 1

Ich würde nur die grundlegende tun

answer = {}
for key, value in list_of_tuples:
  if key in answer:
    answer[key].append(value)
  else:
    answer[key] = [value]

Wenn es diese kurz ist, warum kompliziert alles verwenden. Natürlich, wenn Sie setdefault mit nichts dagegen, dass auch in Ordnung ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top