我正在网上练习python,遇到了这个问题。
https://www.testdome.com/questions/python/file-owners/11846?visibility=1&skillId=9
我不知道该怎么解决。当我互换键和值时,我得到的输出只有唯一的键-值对,如下所示
{'Stan': 'Code.py', 'Randy': 'Input.txt'}
请提出解决方法。
答案 0 :(得分:1)
一种方法是将值放在“ Randy”的列表中,因为在字典中我们不能有多个同名键。这是相同的解决方案,
class FileOwners:
@staticmethod
def group_by_owners(files):
d={}
for i in files:
if files[i] in d:
d[files[i]].append(i)
else:
d[files[i]]=[i]
return d
files = {
'Input.txt': 'Randy',
'Code.py': 'Stan',
'Output.txt': 'Randy'
}
print(FileOwners.group_by_owners(files))
答案 1 :(得分:0)
字典中不能有相同的键。对于您的示例,使用所有者作为键,值将是文件列表。
类似这样的东西:
class FileOwners:
@staticmethod
def group_by_owners(files):
result = {}
for _f in list(files.keys()):
if not files[_f] in result.keys():
result[files[_f]] = []
result[files[_f]].append(_f)
return result
files = {
'Input.txt': 'Randy',
'Code.py': 'Stan',
'Output.txt': 'Randy'
}
print(FileOwners.group_by_owners(files))
答案 2 :(得分:0)
提示:不要使用单个项目作为字典的内容,而要使用列表。然后,使用for
循环,用项目逐渐填充该列表:
output = {}
for key, value in files.items():
if value in output:
output[value].append(key)
else:
output[value] = [key]
return output
您可以在此处看到,我们首先创建一个新字典output
,然后将files
中的键值对放入output
中作为值键。
此处的关键是output
的每个值都是一个 list ,而不仅仅是一个项目。这就是为什么我们在添加值之前先检查output
中是否已经存在该值:如果存在,那么我们只需将新的key
添加到列表中即可。如果没有,我们将创建一个仅包含一个元素的新列表:key
。
dict
不能有重复的键,这就是为什么当您只交换字典(例如output = {val:key for key, val in files.items()}
)时代码无法按预期工作的原因。 Randy
的第一个值被Randy
的第二个值覆盖。
答案 3 :(得分:0)
您可以为此使用defaultdict:
from collections import defaultdict
class FileOwners:
@staticmethod
def group_by_owners(files):
d = defaultdict(list)
for k, v in files.items():
d[v].append(k)
return dict(d)
files = {
'Input.txt': 'Randy',
'Code.py': 'Stan',
'Output.txt': 'Randy'
}
print(FileOwners.group_by_owners(files))
# {'Randy': ['Input.txt', 'Output.txt'], 'Stan': ['Code.py']}