【问题标题】:Add value to key, depending on if the value is in another key向键添加值,具体取决于该值是否在另一个键中
【发布时间】:2018-03-09 06:24:06
【问题描述】:

我有以下字典:

{'Atlanta': [['Bear', 34274], ['Deer', 13747], ['Bee', 83743]],
 'New York': [['Bear', 987], ['Dove', 2635]]}

具有列表作为值的键,其中包含具有动物和数字对的列表。
现在我希望如果一个 Animal 存在于其中的一个键中,我也希望它存在于所有其他键中,但使用零而不是数字,所以字典应该如下所示:

{'Atlanta': [['Bear', 34274], ['Deer', 13747], ['Bee', 83743], ['Dove', 0]], 
 'New York': [['Bear', 987], ['Dove', 2635], ['Deer', 0], ['Bee', 0]]}

我不知道该怎么做。有人可以帮我吗?

【问题讨论】:

  • 以下解决方案之一有帮助吗?如果是这样,请随时接受一个(左侧的绿色勾号),或提出更多问题。

标签: python list dictionary key


【解决方案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]]}

【讨论】:

    【解决方案2】:

    这类似于@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]]})        
    

    【讨论】:

      猜你喜欢
      • 2022-07-25
      • 2012-07-08
      • 1970-01-01
      • 2022-11-16
      • 1970-01-01
      • 2018-04-12
      • 1970-01-01
      • 1970-01-01
      • 2016-11-22
      相关资源
      最近更新 更多