我主要关心的是更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 = 1
和value = list(3)
类似地,键6
存在于键2
,4
和5
的值列表中。我们将在字典中创建一个新的key =6
和value = 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)
非常感谢任何指针。感谢您的时间。
答案 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}