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