将所有键值附加到字典值列表中的列表中

时间:2019-02-11 23:17:24

标签: python list dictionary

我主要关心的是更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)

这将是我们字典的最终输出:

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)

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

2 个答案:

答案 0 :(得分:2)

您可以使用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]}

这个想法是迭代每个(键,值)对,然后将每个值用作键,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]})

请注意,这将返回defaultdict,它是dict的子类。

答案 1 :(得分:0)

仅出于完整性考虑,这是使用dict理解的另一个版本:

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}