如何使用python dict切换值和键?

时间:2019-04-16 10:54:12

标签: python

我的输入是:

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'

6 个答案:

答案 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']}

它如何/为什么起作用?

让我们回顾一下:

  • if条件检查字典中是否已存在该键。遍历字典时,它仅返回键,而不是像dict.items()一样的键值对
  • 如果键在那儿,我们只需将当前值附加到它。
  • 在其他情况下,如果该键不存在,我们会在字典中添加一个新键,但是将其强制转换为列表,否则会将字符串作为值而不是列表插入,而您不会可以附加到它。

答案 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!!!")
相关问题