我有以下字典:
{'Atlanta': [['Bear', 34274], ['Deer', 13747], ['Bee', 83743]],
'New York': [['Bear', 987], ['Dove', 2635]]}
一个键,其列表为包含动物和数字对的列表的值 现在我希望如果一个Animal存在于键中,我也希望它在所有其他键中但是使用Zero而不是数字,所以字典应该如下所示:
{'Atlanta': [['Bear', 34274], ['Deer', 13747], ['Bee', 83743], ['Dove', 0]],
'New York': [['Bear', 987], ['Dove', 2635], ['Deer', 0], ['Bee', 0]]}
我无法弄清楚如何做到这一点。有人能帮助我吗?
答案 0 :(得分:1)
首先查找所有动物名称:
d = {'Atlanta': [['Bear', 34274], ['Deer', 13747], ['Bee', 83743]],
'New York': [['Bear', 987], ['Dove', 2635]]}
>>> animals = {animal for value in d.values() for animal, _ in value}
>>> animals
{'Bear', 'Bee', 'Deer', 'Dove'}
用零填充缺失的那些:
for key, value in d.items():
selected_animals = {animal for animal, _ in value}
for name in animals - selected_animals:
d[key].append([name, 0])
现在:
>>> d
{'Atlanta': [['Bear', 34274], ['Deer', 13747], ['Bee', 83743], ['Dove', 0]],
'New York': [['Bear', 987], ['Dove', 2635], ['Deer', 0], ['Bee', 0]]}
答案 1 :(得分:0)
这类似于@MikeMuller's perfectly fine solution。但是我通过pandas
,因为对于您的用例,您可能希望执行进一步的操作,使用专门构建的库更容易。
在此示例中,生成的数据透视表可能只需。
import pandas as pd, numpy as np
from collections import defaultdict
d = {'Atlanta': [['Bear', 34274], ['Deer', 13747], ['Bee', 83743]],
'New York': [['Bear', 987], ['Dove', 2635]]}
df = pd.DataFrame(columns=['Location', 'Animal', 'Number'])
for k, v in d.items():
for i in v:
df.loc[len(df.index)+1] = [k, i[0], i[1]]
res = pd.pivot_table(df, index='Location', columns='Animal',
values='Number', aggfunc=np.sum, fill_value=0).reset_index()
# Animal Location Bear Bee Deer Dove
# 0 Atlanta 34274 83743 13747 0
# 1 New York 987 0 0 2635
d_out = defaultdict(list)
for idx, row in res.iterrows():
for i in row.index[1:]:
d_out[row[0]].append([i, row[i]])
# defaultdict(list,
# {'Atlanta': [['Bear', 34274],
# ['Bee', 83743],
# ['Deer', 13747],
# ['Dove', 0]],
# 'New York': [['Bear', 987],
# ['Bee', 0],
# ['Deer', 0],
# ['Dove', 2635]]})