J'essaye de combiner une liste, semblable à la suivante

l = [['A', '1'], ['A', '2'], ['B', '1'], ['C', '1'], ['C', '2']]

Dans un dictionnaire, où le premier élément d'une liste imbriquée est la clé

d = {'A': ['1', '2'], 'B': ['1'], 'C': ['1', '2']}

Est-il possible de le faire assez facilement?

0
Kacper Reicher 19 oct. 2020 à 15:15

5 réponses

Meilleure réponse

Le plus simple est le suivant, en utilisant dict.setdefault:

d = {}
for k, v in l:
    d.setdefault(k, []).append(v)

Avec un collections.defaultdict, le code devient égal nettoyeur:

from collections import defaultdict

d = defaultdict(list)
for k, v in l:
    d[k].append(v)
6
schwobaseggl 19 oct. 2020 à 12:25

Voici une manière traditionnelle de le faire. Parcourez simplement la liste et ajoutez les clés et les valeurs au dictionnaire. Voici le code complet:

l = [['A', '1'], ['A', '2'], ['B', '1'], ['C', '1'], ['C', '2']]
dictionary = {}
for key,value in l:
    if key in dictionary.keys():
        dictionary[key].append(value)
    else:
        dictionary[key] = [value]
print(dictionary)

Production:

{'A': ['1', '2'], 'B': ['1'], 'C': ['1', '2']}
0
Sushil 19 oct. 2020 à 12:19

Itérez sur l et ajoutez les clés de la dictionbary comme ceci:

d = {}
for item in l:
    

if item[0]  in d.keys():
    d[item[0]].append(item[1])
if item[0] not in d.keys():
    d[item[0]] = [item[1]]
0
sam 19 oct. 2020 à 12:21

L'utilisation de defaultdict peut vous aider ici

from collections import defaultdict

l = [['A', '1'], ['A', '2'], ['B', '1'], ['C', '1'], ['C', '2']]
d = defaultdict(list)
for x in l:
  d[x[0]].append(x[1])
print(d)

Production

defaultdict(<class 'list'>, {'A': ['1', '2'], 'B': ['1'], 'C': ['1', '2']})
0
balderman 19 oct. 2020 à 12:19

Vous pouvez utiliser itertools.groupby:

l = [['A', '1'], ['A', '2'], ['B', '1'], ['C', '1'], ['C', '2']]
d={}
for i,k in itertools.groupby(sorted(l, key=lambda x: x[0]), key=lambda x: x[0]):
    d[i]=list(itertools.chain(*(p[1:] for p in k)))

>>> print(d)
{'A': ['1', '2'], 'B': ['1'], 'C': ['1', '2']}
1
IoaTzimas 19 oct. 2020 à 12:48