2017-09-19 6 views
1

J'ai deux listes:Mettre les valeurs des mêmes clés de dictionnaire dans un groupe en python

list1=[0,0,0,1,1,2,2,3,3,4,4,5,5,5]
list2=['a','b','c','d','e','f','k','o','n','q','t','z','w','l']

dictionary=dict(zip(list1,list2)) 

Je voudrais les valeurs de sortie des mêmes touches dans l'un pour chaque clé comme il va imprimer comme ceci:

0 ['a','b','c'] 
1 ['d','e'] 
2 ['f','k'] 
3 ['o','n'] 
4 ['q','t'] 
5 ['z','w','l'] 

J'ai écrit le code suivant pour le faire mais ça ne fonctionne pas comme je encre

for k,v in dictionary.items(): 

    print (k,v) 

Pourriez-vous me dire comment corriger le code afin que je puisse obtenir au-dessus des résultats prévus, s'il vous plaît? Merci d'avance!

+0

Qu'est-ce 'dictionary'? – HyperNeutrino

+0

pourriez-vous montrer où vous créez votre dictionnaire? – Legman

+0

Désolé, je l'ai oublié dans la première fois, j'ai mis à jour mon code @Legman –

Répondre

3

En ce qui concerne votre code:

dictionary = dict(zip(list1, list2)) 

crée le dictionnaire:

{0: 'c', 1: 'e', 2: 'k', 3: 'n', 4: 't', 5: 'l'} 

qui perd tout sauf la dernière valeur dans chaque groupe. Vous devez traiter les listes compressées pour construire les données groupées. Deux façons sont avec itertools.groupby() ou avec un defaultdict(list), montré ici.

Utilisez une collections.defaultdict des listes pour regrouper les éléments avec les clés de list1 et les valeurs de list2. Associez les articles de chaque liste avec zip():

from collections import defaultdict 

list1=[0,0,0,1,1,2,2,3,3,4,4,5,5,5] 
list2=['a','b','c','d','e','f','k','o','n','q','t','z','w','l'] 

d = defaultdict(list) 

for k,v in zip(list1, list2): 
    d[k].append(v) 

for k in sorted(d): 
    print('{} {!r}'.format(k, d[k])) 

Sortie:

 
0 ['a', 'b', 'c'] 
1 ['d', 'e'] 
2 ['f', 'k'] 
3 ['o', 'n'] 
4 ['q', 't'] 
5 ['z', 'w', 'l'] 

Puisque les articles dans un dictionnaire ne sont pas ordonnés, la sortie est triée par clé.

3

Le code que vous avez montré ne ressemble en rien à ce que vous avez décrit.

Cela mis à part, vous pouvez les valeurs du groupe de la même clé ensemble de premier zipper les listes et le regroupement puis les valeurs de la même clé en utilisant un collections.defaultdict:

from collections import defaultdict 

d = defaultdict(list) 
for k, v in zip(list1, list2): 
    d[k].append(v) 
print(d) 
# defaultdict(<type 'list'>, {0: ['a', 'b', 'c'], 1: ['d', 'e'], 2: ['f', 'k'], 3: ['o', 'n'], 4: ['q', 't'], 5: ['z', 'w', 'l']}) 
3

Vous pouvez utiliser itertool.groupby pour un concis, une solution de ligne:

import itertools 
list1=[0,0,0,1,1,2,2,3,3,4,4,5,5,5] 
list2=['a','b','c','d','e','f','k','o','n','q','t','z','w','l'] 
final_list = {a:[i[-1] for i in list(b)] for a, b in itertools.groupby(zip(list1, list2), key=lambda x: x[0])} 
for a, b in final_list.items(): 
    print(a, b) 

Sortie:

0 ['a', 'b', 'c'] 
1 ['d', 'e'] 
2 ['f', 'k'] 
3 ['o', 'n'] 
4 ['q', 't'] 
5 ['z', 'w', 'l']