Python的 - 填充的嵌套字典
开始形成一个列表:Python的 - 填充的嵌套字典
user1 = ['alternative', 'rock', 'pop']
我可以填充每个项目的appearences的数量dictionary
。
u1={}
for tag in user1:
u1[tag]=1
print u1
,并得到:{'alternative': 1, 'pop': 1, 'rock': 1}
同样,为:
user2 = ['indie', 'rock', 'chamber pop']
相同:
u2={}
for tag in user2:
u2[tag]=1
print u2
,并得到:{'indie': 1, 'chamber pop': 1, 'rock': 1}
,等等。
,但可以说,我想以同样的方式来填充这个dict
:
users = {
u1:{},
u2:{},
u3:{},
...
...
}
我该怎么办呢?
比方说,你有用户和列表已经存储到字典。然后,你可以内dictionary comprehension遍历所有键值对,并使用Counter
到列表转换为dict
与计数:
from collections import Counter
users = {
'u1': ['alternative', 'rock', 'pop'],
'u2': ['indie', 'rock', 'chamber pop'],
'u3': ['indie', 'rock', 'alternative', 'rock']
}
res = {k: Counter(v) for k, v in users.items()}
print(res)
输出:
{'u1': Counter({'alternative': 1, 'pop': 1, 'rock': 1}),
'u3': Counter({'rock': 2, 'indie': 1, 'alternative': 1}),
'u2': Counter({'indie': 1, 'chamber pop': 1, 'rock': 1})}
要突破有点users.items()
以上返回(key, value)
的迭代元组:
>>> list(users.items())
[('u2', ['indie', 'rock', 'chamber pop']), ('u1', ['alternative', 'rock', 'pop']), ('u3', ['indie', 'rock', 'alternative', 'rock'])]
然后字典理解将列表变成dict
个含有计数:
>>> Counter(['indie', 'rock', 'chamber pop'])
Counter({'rock': 1, 'indie': 1, 'chamber pop': 1})
最后为每个用户名和所得Counter
在添加到结果dict
。
Counter
是一个不错的选择。但根据这个问题,我们可以使用更简单的选项。看一下这个。
users = {
'u1': ['alternative', 'rock', 'pop'],
'u2': ['indie', 'rock', 'chamber pop'],
}
res = {}
for user in users.items(): # return each key:value pair as tuple
res[user[0]] = {} # first element of tuple used as key in `res` for each list
for tag in user[1]: # return each element of list
res[user[0]][tag] = 1 # assign value as 1 of each element.
print res
输出:
{'u1': {'alternative': 1, 'pop': 1, 'rock': 1}, 'u2': {'indie': 1, 'chamber pop': 1, 'rock': 1}}
确实更简单。我只是使用'流派'或'标签'而不是'list_user',以使其更具可读性。 –
感谢您的反馈 – Simplans
你可以用的'计数器(V)'和'dict':'字典(计数器(V))'如果你必须有一个普通的'dict'而不是一个“计数器”。 –
@DanD。很好的补充,通常它并不重要,虽然'Counter'是一个'dict',并且在几乎所有场景中表现得像一个。 – niemmi
谢谢。从长远来看,这种技术更有用。 –