39 votes

Conversion d'une liste de tuples en un dict en Python

J'ai une liste de tuples comme ceci:

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

Je veux répéter cette saisie par le premier élément, donc par exemple je pourrais imprimer quelque chose comme ceci:

 a 1 2 3
b 1 2
c 1
 

Comment pourrais-je procéder sans garder un élément pour savoir si le premier élément est le même que si je boucle les tuples. Cela semble plutôt compliqué (en plus, je dois trier la liste pour commencer) ...

Merci,

Dan

42voto

Ned Batchelder Points 128913
 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
 

produit:

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

37voto

S.Lott Points 207588

Un peu plus simple ...

 >>> 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]})
 

9voto

user7461 Points 71

Une solution utilisant 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]) vous donne un itérateur qui contient ['a', [('a', 1), ...], c, [('c', 1)],. ..]

3voto

lacker Points 2218

Je ferais juste le basique

réponse = {}
pour la clé, valeur dans list_of_tuples:
  si clé dans la réponse:
    réponse [clé] .append (valeur)
  autre:
    répondre [clé] = [valeur]

Si c'est si court, pourquoi utiliser quelque chose de compliqué. Bien sûr, si cela ne vous dérange pas d'utiliser setdefault, ça va aussi.

2voto

J.F. Sebastian Points 102961

Imprimer la liste des tuples regroupés par le premier élément

Cette réponse est basée sur celle de @gommen .

 #!/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)
 

Production:

 a 1 2 3
b 1 2
c 1
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X