【问题标题】:Append all key values to list that are present in value list of a dictionary将所有键值附加到字典值列表中存在的列表
【发布时间】:2019-07-05 12:54:39
【问题描述】:

我主要关心的是更 Python 化地执行此操作。下面的代码有效,但看起来很笨重。

我有一个字典,其中的键映射到列表。我想遍历字典并查看每个键是否在值列表中,如果是,则将其附加到与该键值关联的新列表中。我将在下面发布一个示例以进行说明。

为了简化问题,假设我有一个这样的字典:

my_dict = {1: [3], 2: [4,5,6], 3: [1,2], 4: [5,6], 5: [4,6], 6: [4,5]}

在 my_dict 中,键 1 存在于键 3 的值列表中,因此我们将创建一个带有 key = 1value = list(3) 的新字典

同样,键 6 存在于键 245 的值列表中。我们将在字典中创建一个新的key =6value = list(2,4,5)

这将是我们的 dict 的最终输出:

output_dict = {1: [3], 2: [3], 3: [1], 4: [2,5,6], 5: [2, 4, 6], 6: [2,4,5]}

到目前为止我的代码:

new_dict = {}
for k, v in my_dict.items():
    new_dict[k] = []

for k , v in my_dict.items():
    for k2 in new_dict.keys():
        if k2 in v:
            new_dict[k2].append(k)

非常感谢任何指针。感谢您的时间。

【问题讨论】:

    标签: python list dictionary


    【解决方案1】:

    您可以使用setdefault反转字典:

    my_dict = {1: [3], 2: [4, 5, 6], 3: [1, 2], 4: [5, 6], 5: [4, 6], 6: [4, 5]}
    
    new_dict = {}
    for key, values in my_dict.items():
        for value in values:
            new_dict.setdefault(value, []).append(key)
    
    print(new_dict)
    

    输出

    {1: [3], 2: [3], 3: [1], 4: [2, 5, 6], 5: [2, 4, 6], 6: [2, 4, 5]}
    

    这个想法是遍历每个 (key, values) 对,然后使用每个值作为键,setdefault 将处理缺少键的情况。另一种方法是将空列表设置为new_dict 中每个新键的默认值,例如:

    # set the empty list for each new key in new_dict
    new_dict = {}
    for values in my_dict.values():
        for value in values:
            new_dict[value] = []
    
    # fill new_dict
    for key, values in my_dict.items():
        for value in values:
            new_dict[value].append(key)
    

    这将产生与上面相同的输出,第三个选项是使用collections.defaultdict 并跳过第一个循环:

    from collections import defaultdict
    
    my_dict = {1: [3], 2: [4, 5, 6], 3: [1, 2], 4: [5, 6], 5: [4, 6], 6: [4, 5]}
    
    new_dict = defaultdict(list)
    for key, values in my_dict.items():
        for value in values:
            new_dict[value].append(key)
    
    print(new_dict)
    

    输出

    defaultdict(<class 'list'>, {1: [3], 2: [3], 3: [1], 4: [2, 5, 6], 5: [2, 4, 6], 6: [2, 4, 5]})
    

    请注意,这会返回一个默认字典,即字典的子类。

    【讨论】:

      【解决方案2】:

      为了完整起见,这里是另一个使用字典理解的版本:

      from itertools import chain
      my_dict = {1: [3], 2: [4,5,6], 3: [1,2], 4: [5,6], 5: [4,6], 6: [4,5]}
      
      vals = set(chain.from_iterable(my_dict.values()))
      d = {val:[k for k, v in my_dict.items() if val in v] for val in vals}
      

      【讨论】:

        猜你喜欢
        • 2023-03-23
        • 2022-01-06
        • 1970-01-01
        • 2020-04-09
        • 2022-12-17
        • 2015-07-03
        • 2017-11-15
        • 1970-01-01
        相关资源
        最近更新 更多