向字典中添加项目

Adding items into a dictionary

你好,我正在处理的项目的代码有问题。我目前正在尝试操作字典并向其中添加内容,但是我的代码有些奇怪。我的函数的第一步是获取如下所示的文本文件:

A;X;Y;Z
B;Y;Z;X
C;Y;Z;X
D;Z;X;Y
E;Z;X;Y

然后我将文本行放入字典中。示例:

defaultdict(<class 'set'>, {'E': {'Z', 'X', 'Y'}, 'C': {'Y', 'Z', 'X'}, 'A': {'X', 'Y', 'Z'}, 'D': {'Z', 'X', 'Y'}, 'B': {'Y', 'Z', 'X'}})

我编写了 for 循环来执行此操作,但我遇到的问题是,在将项目添加到字典时,代码出于某种原因混淆了字典中的值。

def read_voter_preferences(file : open):
    votes_dict = defaultdict(set)
    for line in file:
        line = line.strip().split(";")
        for i in range(1,4):
            print(votes_dict)
            votes_dict[line[0]].add(line[i])
    return votes_dict

输出是这样的:defaultdict(<class 'set'>, {'E': {'X', 'Y', 'Z'}, 'C': {'X', 'Y', 'Z'}, 'A': {'X', 'Y', 'Z'}, 'D': {'X', 'Y', 'Z'}, 'B': {'X', 'Y', 'Z'}})

当代码将项目添加到字典中时,它混淆了对这个特定项目很重要的字典项目的顺序。我该如何解决? .add() 会自动对列表中的项目进行排序吗?谢谢!

语法

{'Z', 'X', 'Y'}

声明了 项,其中只有成员身份很重要,而不是顺序。因此 Python 在显示集合时可以随意重新排序项目。

要保留顺序,请使用 列表:

['Z', 'X', 'Y']

A set,与 dict 一样, 保持顺序。如果您所说的顺序很重要,那么您必须使用 list 而不是 set 来维护它。所以,如果您不担心重复:

votes_dict = dict()
for line in file:
    line = line.strip().split(";")
    votes_dict[line[0]] = line[1:]
return votes_dict

请注意,您在这里并不需要 default_dict

如果你需要同时维护秩序删除重复项,你的生活会更艰难,但还不算太糟糕;例如:

votes_dict = dict()
for line in file:
    line = line.strip().split(";")
    votes_dict[line[0]] = thelist = []
    seen = set()
    for item in line[1:]:
        if item in seen: continue
        thelist.append(item)
        seen.add(item)
return votes_dict

可以偷工减料,避免创建和维护seen,并使用类似:

votes_dict = dict()
for line in file:
    line = line.strip().split(";")
    votes_dict[line[0]] = thelist = []
    for item in line[1:]:
        if item in thelist: continue
        thelist.append(item)
return votes_dict

检查 in 使用列表而不是集合通常是不好的,但是对于像您这里这样的非常短的列表来说很好,所以这个可能是最好的。 (将本地名称作为您正在构建的列表的别名是一项值得记住的技术——没有理由 重复 索引 votes_dict:-)。