Python - 填充嵌套的词典

时间:2016-11-23 02:43:50

标签: python list dictionary

从列表开始:

user1 = ['alternative', 'rock', 'pop']

我可以使用每个项目的出现次数填充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:{},
         ...
         ...
        }

我该怎么办?

2 个答案:

答案 0 :(得分: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 comprehension将列表转换为包含计数的dict

>>> Counter(['indie', 'rock', 'chamber pop'])
Counter({'rock': 1, 'indie': 1, 'chamber pop': 1})

最后,每个用户名和结果Counter都会添加到结果dict

答案 1 :(得分: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}}