我的输入是:
files = {
'Input.txt': 'Randy',
'Code.py': 'Stan',
'Output.txt': 'Randy'
}
我希望输出为:
{'Randy':['Input.txt','Output.txt'], 'Stan':['Code.py']}
基本上是此switch key and values in a dict of lists
的另一个方向这是我尝试过的:
dictresult= {}
for key,value in files.items():
dictresult[key]=value
dictresult[value].append(key)
但是它不起作用。我得到KeyError: 'Randy'
答案 0 :(得分:4)
这是一种简单的方法,我们在原始字典keys
的{{1}}和values
上进行迭代,并为每个值创建列表以将与该值相对应的所有键附加到该值。
files
答案 1 :(得分:1)
您的代码有一些问题。
让我们回顾一下:
首先,您收到键错误,因为您试图将一个值附加到不存在的键上。为什么?因为在您之前的语句中,您向dict [key]添加了一个值,现在您正尝试访问/附加dict [value]。
dictresult[key]=value
您正在将值分配给新生成的密钥,而无需进行任何检查。每个新值都会覆盖它。
dictresult[value].append(key)
您可以通过以下代码实现所需的目标:
d = {}
for key,value in files.items():
if value in d:
d[value].append(key)
else:
d[value] = [key]
print(d)
它将输出:
{'Randy': ['Input.txt', 'Output.txt'], 'Stan': ['Code.py']}
它如何/为什么起作用?
让我们回顾一下:
答案 2 :(得分:0)
尝试使用defaultdict-
from collections import defaultdict
dictresult= defaultdict(list)
for key,value in files.items():
dictresult[value].append(key)
这将假定字典中每个项目中都有一个空列表,因此追加操作不会失败
答案 3 :(得分:0)
您可以检查dictresult中是否存在作为键的值
喜欢
dictresult= {}
for key,value in files.items():
if not value in dictresult: dictresult [value]=[]
dictresult[value].append(key)
答案 4 :(得分:0)
output = {}
for key, value in files.items():
output[value] = output.get(value, []) + [key]
print(output)
# {'Randy':['Input.txt','Output.txt'], 'Stan':['Code.py']}
答案 5 :(得分:0)
您可以通过两种方式做到这一点。
from collections import defaultdict
files = {"Input.txt": "Randy", "Code.py": "Stan", "Output.txt": "Randy"}
expected = {"Randy": ["Input.txt", "Output.txt"], "Stan": ["Code.py"]}
# 1st method. Using defaultdict
inverted_dict = defaultdict(list)
{inverted_dict[v].append(k) for k, v in files.items()}
assert inverted_dict == expected, "1st method"
# 2nd method. Using regular dict
inverted_dict = dict()
for key, value in files.items():
inverted_dict.setdefault(value, list()).append(key)
assert inverted_dict == expected, "2nd method"
print("PASSED!!!")