填写字典中的字典

时间:2016-03-08 13:29:45

标签: python list dictionary

我有2个名单:

num = ['10', '10', '10', '88', '77', '77', '10']
typ = ['KB', 'BK', 'KB', 'TP', 'HK', 'KH', 'KB']

我想制作一个字典词典,如下所示:

{'10':{'KB':3, 'BK':1}, '88':{'TP':1}, '77':{'HK':1, 'KH':1}}

我将有一个主要的数字字典,对于每个数字,我想计算每个数字附带的“typ”的出现次数。

我试过了:

di={}

for i in num:
    if i not in di:
        di[i]={}     
        for x in typ:
            di[i][x]+=1

并收到此错误:

KeyError: 'KB'

为num中的每个数字填写字典的最佳方法是什么?

7 个答案:

答案 0 :(得分:3)

以下是使用zipcollections.defaultdict的简短解决方案:

from collections import defaultdict
num = ['10', '10', '10', '88', '77', '77', '10']
typ = ['KB', 'BK', 'KB', 'TP', 'HK', 'KH', 'KB']

d = defaultdict(dict)
for k, v in zip(typ, num):
    d[v][k] = d[v].get(k, 0) + 1

答案 1 :(得分:2)

您从未检查x中是否有di[i],因此您不能+=1,因为它不存在。

di={}

for i in num:
    if i not in di:
        di[i]={}     
        for x in typ:
            if x not in di[i]:
                di[i][x] = 0
            di[i][x]+=1

由于您希望默认值为零,因此Python可以使用defaultdict

来提供帮助
import collections
di = collections.defaultdict(lambda: collections.defaultdict(int))
for i in num:
    for x in typ:
        di[i][x] += 1

并结合其他一些答案,使用zip

import collections
di = collections.defaultdict(lambda: collections.defaultdict(int))
for n, t in zip(num, typ):
    di[n][t] += 1

答案 2 :(得分:2)

您可以将zip()dict.get()

一起使用
di = {}
for n, t in zip(num, typ):
    di[n] = di.get(n, {})
    di[n][t] = di[n].get(t, 0) + 1

你的问题是你说+= 1。第一次这样做时,di[i][x]尚未定义。 di[i][x] += 1几乎是di[i][x] = di[i][x] + 1的快捷方式,但由于您尚未定义di[i][x],因此存在KeyError。但是,在我的情况下,我使用di[n].get(t, 0),如果di[n][t]的密钥为di[n],则表示t,否则为0。

答案 3 :(得分:1)

defaultdictcollections模块中的Counter一起使用

>>> from collections import defaultdict, Counter
>>> d = defaultdict(list)
>>> for item in zip(num, typ):
...     d[item[0]].append(item[1])
... 
>>> {key:Counter(values) for key, values in d.items()}
{'88': Counter({'TP': 1}), '77': Counter({'HK': 1, 'KH': 1}), '10': Counter({'KB': 3, 'BK': 1})}

如果您觉得需要转换为dict,那么:

>>> {key:dict(Counter(values)) for key, values in d.items()}
{'88': {'TP': 1}, '77': {'HK': 1, 'KH': 1}, '10': {'KB': 3, 'BK': 1}}

您还可以使用setdefault方法代替Counter

>>> d = {}
>>> for item in zip(num, typ):
...     d.setdefault(item[0], []).append(item[1])
... 
>>> d
{'88': ['TP'], '77': ['HK', 'KH'], '10': ['KB', 'BK', 'KB', 'KB']}
>>> {k: dict(Counter(v)) for k, v in d.items()}
{'88': {'TP': 1}, '77': {'HK': 1, 'KH': 1}, '10': {'KB': 3, 'BK': 1}}

答案 4 :(得分:0)

以下是我拍摄的照片,

num = ['10', '10', '10', '88', '77', '77', '10']
typ = ['KB', 'BK', 'KB', 'TP', 'HK', 'KH', 'KB']

result ={}

for x,y in enumerate(num):
    if not y in result.keys():
        result[y] = dict()
    try:
        result[y][typ[x]] += 1
    except KeyError:
        result[y][typ[x]] = 1

print(result)

答案 5 :(得分:0)

您可以尝试使用zip

d ={}

for n,t in zip(num,typ):
    if n not in d:
        d[n] = {t:1}
    else:
        if t not in d[n]:
            d[n][t] = 1
        else:
            d[n][t] += 1

输出:

{'10': {'BK': 1, 'KB': 3}, '77': {'HK': 1, 'KH': 1}, '88': {'TP': 1}}

答案 6 :(得分:0)

以下是这样做的方法:

num=['10', '10', '10', '88', '77', '77', '10']
typ=['KB', 'BK', 'KB', 'TP', 'HK', 'KH', 'KB']

di={}

for i in range(len(num)):
    if num[i] not in di:
        di[num[i]]={}     
    if typ[i] not in di[num[i]]:
        di[num[i]][typ[i]] = 1
    else:
        di[num[i]][typ[i]] += 1