我有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中的每个数字填写字典的最佳方法是什么?
答案 0 :(得分:3)
以下是使用zip
和collections.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)
将defaultdict
与collections
模块中的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