2016-11-23 91 views
2

开始形成一个列表: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:{}, 
     ... 
     ... 
     } 

我该怎么办呢?

回答

1

比方说,你有用户和列表已经存储到字典。然后,你可以内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

+0

你可以用的'计数器(V)'和'dict':'字典(计数器(V))'如果你必须有一个普通的'dict'而不是一个“计数器”。 –

+0

@DanD。很好的补充,通常它并不重要,虽然'Counter'是一个'dict',并且在几乎所有场景中表现得像一个。 – niemmi

+0

谢谢。从长远来看,这种技术更有用。 –

1

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}} 
+0

确实更简单。我只是使用'流派'或'标签'而不是'list_user',以使其更具可读性。 –

+0

感谢您的反馈 – Simplans