python中具有多个值的同名键

时间:2018-07-27 11:56:48

标签: python dictionary

我正在网上练习python,遇到了这个问题。

https://www.testdome.com/questions/python/file-owners/11846?visibility=1&skillId=9

我不知道该怎么解决。当我互换键和值时,我得到的输出只有唯一的键-值对,如下所示

{'Stan': 'Code.py', 'Randy': 'Input.txt'}

请提出解决方法。

4 个答案:

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