Mam listę słowników, które mają swoje wartości niektóre kroki:

dic1 = {
    'persuaded ': [[('teacher', '6'), ('group', '5'), ('man', '5'), ('girl', '5')]], 
    'removed ': [[('apple', '5'), ('makeup', '4'), ('trash', '4'), ('stain', '4')]]
}

To, co muszę zrobić, to przekonwertować zagnieżdżone krążki do słowników, dzięki czemu mogę porównać go z innymi podobnymi listami, używając kluczy. Idealnym wynikiem byłoby:

dic2 = {
    'persuaded ': [{'teacher': '6'}, {'group': '5'}, {'man': '5'}, {'girl': '5'}], 
    'removed ': [{'apple': '5'}, {'makeup': '4'}, {'trash': '4'}, {'stain': '4'}]
} 

Próbowałem:

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

I:

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

Ale nie idzie wystarczająco głęboko w słowniku. Naprawdę doceniłbym jakieś sugestie dotyczące rozwiązania tego! Dzięki!

1
user3008918 22 listopad 2013, 20:47

3 odpowiedzi

Najlepsza odpowiedź

Poniższe zagnieżdżone przyciski DICT i Lista zrobią to dla Ciebie:

dic2 = {key: [{k: v} for sublist in value for k, v in sublist] for key, value in dic1.items()}

Próbny:

>>> {key: [{k: v} for sublist in value for k, v in sublist] for key, value in dic1.items()}
{'removed ': [{'apple': '5'}, {'makeup': '4'}, {'trash': '4'}, {'stain': '4'}], 'persuaded ': [{'teacher': '6'}, {'group': '5'}, {'man': '5'}, {'girl': '5'}]}
>>> from pprint import pprint
>>> pprint(_)
{'persuaded ': [{'teacher': '6'}, {'group': '5'}, {'man': '5'}, {'girl': '5'}],
 'removed ': [{'apple': '5'}, {'makeup': '4'}, {'trash': '4'}, {'stain': '4'}]}

Jestem rzeczywiście zaskoczony, że nie chciałeś mieć słownika jeden na wartość:

dic2 = {key: {k: v for sublist in value for k, v in sublist} for key, value in dic1.items()}

Który produkuje:

>>> {key: {k: v for sublist in value for k, v in sublist} for key, value in dic1.items()}
{'removed ': {'stain': '4', 'trash': '4', 'apple': '5', 'makeup': '4'}, 'persuaded ': {'group': '5', 'teacher': '6', 'man': '5', 'girl': '5'}}
>>> pprint(_)
{'persuaded ': {'girl': '5', 'group': '5', 'man': '5', 'teacher': '6'},
 'removed ': {'apple': '5', 'makeup': '4', 'stain': '4', 'trash': '4'}}
2
Martijn Pieters 22 listopad 2013, 16:57

Jeśli pozbędziesz się niepotrzebnego opakowania listy, tj.

dic1 = {'persuaded ': [('teacher', '6'), ('group', '5'), ('man', '5'), ('girl', '5')], 'removed ': [('apple', '5'), ('makeup', '4'), ('trash', '4'), ('stain', '4')]}

Możesz to zrobić dość proste:

dic2 = dict((k1, dict(v1)) for k1, v1 in dic1.items())

To daje

{'persuaded ': {'girl': '5', 'man': '5', 'group': '5', 'teacher': '6'}, 'removed ': {'apple': '5', 'makeup': '4', 'stain': '4', 'trash': '4'}}

Który wydaje się bardziej przydatny niż lista słowników jednoosobowych.

(Jeśli nie możesz pozbyć się dodatkowego poziomu list, wystarczy użyć dict(v1[0]).)

2
jonrsharpe 22 listopad 2013, 16:59
dict((k, v) for k,v in c1.items())
0
Smita K 22 listopad 2013, 17:37