2012-07-06 5 views
2

J'ai une liste python qui contient des dictionnaires et je veux faire une nouvelle liste qui contient des dictionnaires avec des clés uniques et les valeurs de liste associées comme ci-dessous:Python dictionnaire avec les mêmes clés

Input: 
[{1: 2}, {2: 2}, {1: 3}, {2: 1}, {1: 3}] 
Output: 
[{1:[2,3,3]},{2:[2,1]}] 

Merci à l'avance.

+11

http://whathaveyoutried.com/ –

+0

Est-ce que chaque clé unique elle-même contient également dans la liste? Je me demande simplement comment la liste '[1,2,3]' est formée car il me manque quelque chose. – jamylak

+1

@ IgnacioVazquez-Abrams: Peut-on se passer de cette URL? Mieux vaut utiliser quelque chose comme [ce script] (http://stackapps.com/questions/2116/autoreviewcomments-pro-forma-comments-for-se) et rédiger des recommandations plus verbeuses pour inclure plus d'informations sur ce que le PO a essayé, éventuellement avec un lien vers cet article. –

Répondre

7

Que diriez-vous:

input = [{1: 2}, {2: 2}, {1: 3}, {2: 1}, {1: 3}] 

r = {} 
for d in input: 
    # (assumes just one key/value per dict) 
    ((x, y),) = d.items() 
    r.setdefault(x, []).append(y) 

print [ {k: v} for (k, v) in r.items() ] 

Résultat:

[{1: [2, 3, 3]}, {2: [2, 1]}] 

[mise à jour]

curieux: Pouvez-vous expliquer ce qui se passe dans ((x, y),) = d.items() et r.setdefault(x, []).append(y)? - damned

D'abord le ((x, y),) = d.items():

  • à ce stade, d sera un élément de input, comme {1: 2}
  • d.items() sera quelque chose d'analogue à [(1, 2)]
  • afin de déballer 1 et 2 en x et y, nous avons besoin du , supplémentaire (sinon l'interprète pensera que les parenthèses externes font le groupement au lieu de définir un seul ele ment tuple)

Le r.setdefault(x, []).append(y) est analogue à:

if not r.has_key(x): 
    r[x] = [] 
r[x].append(y) 
+1

juste curieux: Pouvez-vous expliquer ce qui se passe dans '((x, y),) = d.items()' et 'r.setdefault (x, []). Append (y)'? – damned

+1

mis à jour avec des commentaires. –

3

Trick est d'utiliser dict.setdefault pour commencer une liste et d'y ajouter du:

input = [{1: 2}, {2: 2}, {1: 3}, {2: 1}, {1: 3}] 
output = {} 
for d in input: 
    for k,v in d.items(): 
     output.setdefault(k, []).append(v) 

# output contains {1: [2, 3, 3], 2: [2, 1]} 

output=[{k:v} for k,v in output.items()] 

# output contains [{1: [2, 3, 3]}, {2: [2, 1]}] 

Qu'est-ce que setdefault est retourne soit la liste existante avec 'k', ou si cette clé n'existe pas dans le dictionnaire, elle crée une nouvelle entrée pour cette clé avec le second argument et la retourne. Dans les deux cas, il renvoie la liste, qu'elle soit préexistante ou nouvelle, de sorte que vous pouvez y ajouter.

+0

Ma sortie était [{1: [2,3,3]}, {2: [2,1]}] pas {1: [2, 3, 3], 2: [2, 1]} –

+0

En effet. Ajout d'une transformation – Benedict

0
>>> lis=[{1: 2}, {2: 2}, {1: 3}, {2: 1}, {1: 3}] 
>>> new_lis=[{}] 
>>> for x in lis: 
    for y in x: 
     if y in new_lis[0]: 
      new_lis[0][y].append(x[y]) 
      new_lis[0][y].sort() 
     else :new_lis[0][y]=[x[y]] 


>>> new_lis 
[{1: [2, 3, 3], 2: [1, 2]}] 
0
>>> data = [{1: 2}, {2: 2}, {1: 3}, {2: 1}, {1: 3}] 
... 
... from itertools import groupby 
... 
... keyFn = lambda x: x.keys()[0] 
... 
... [{k: [i.values()[0] for i in g]} for k, g in groupby(sorted(data, key=keyFn), keyFn)] 
0: [{1: [2, 3, 3]}, {2: [2, 1]}] 
0
output = [] 
for b in a: 
    added = 0 
    i = 0 
    for c in output: 
    if b.keys()[0] in c.keys(): 
     output[i][b.keys()[0]].append(b[b.keys()[0]]) 
     added = 1 
    i += 1 

    if not added: 
    output.append({b.keys()[0]: [b[b.keys()[0]]]}) 
+0

Dans votre exemple, qu'est-ce que ls?(pour c en ls :). – octopusgrabbus

+0

Oh merci de le signaler. C'était un type. 'ls' est en fait' output'. – vaidik

Questions connexes