向key添加值,具体取决于值是否在另一个键中

时间:2018-03-09 06:24:07

标签: python list dictionary key

我有以下字典:

{'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]]}

我无法弄清楚如何做到这一点。有人能帮助我吗?

2 个答案:

答案 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]]})