如何允许字典值枚举的行为类似于Python中的字典键枚举



我正试图从文件中提取数据,将其放入列表,将该列表放入字典,然后将该字典附加到一个更大的字典中,并使用相应的键名。到目前为止,一切都正常,除了值worddict只提供最新版本,而密钥则根据其名称进行更改。如何将当前的worddict附加到bigDictionary,而不是文件的最后一行(worddict的最后一个值(

import csv
bigDictionary = {}
worddict={}
with open('puzzle.csv') as csvfile:
csvreader = csv.reader(csvfile, delimiter='n')
for row in csvreader:
wordrow = ''.join(row)
wordlist=wordrow.split('t')
worddict['y']=wordlist[0]
worddict['x']=wordlist[1]
worddict['box']=wordlist[2]
worddict['direction']=wordlist[3]
worddict['word']=wordlist[4]
worddict['clue']=wordlist[5]
print(worddict)
#bigDictionary.update({wordlist[4]:worddict})
bigDictionary[wordlist[4]] = worddict
print(bigDictionary)

在Python中,当您将一个变量分配给第二个变量时,您只会创建对第二个参数的引用。这意味着当第二个变量发生变化时,第一个变量也会发生变化。

x = [1, 2, 3]
# y is only a reference to x 
y = x
# When x changes, y will as well
x[2] = 5
print(y)
# y points to the same object as x
[1, 2, 5]

来源:对象和参考

当您将bigDictionary的关键字指定给worddict时,您正在创建对worddict的引用,这意味着当worddict更改时,bidDictionary中的相应值将更改为新的worddict

就代码而言,问题是在循环开始之前只定义了worddict一次。要解决这个问题,您需要为每一行创建一个新的worddict,然后将其分配给bidDictionary中的键。

import csv
bigDictionary = {}

with open('puzzle.csv') as csvfile:
csvreader = csv.reader(csvfile, delimiter='n')
for row in csvreader:
# Define new dictionary
worddict={}
wordrow = ''.join(row)
wordlist=wordrow.split('t')
worddict['y']=wordlist[0]
worddict['x']=wordlist[1]
worddict['box']=wordlist[2]
worddict['direction']=wordlist[3]
worddict['word']=wordlist[4]
worddict['clue']=wordlist[5]
bigDictionary[wordlist[4]] = worddict

另一种选择是使用copy模块,每次通过循环创建worddict的副本(文档(。

作为一条建议,Pandas库非常适合处理csv文件。值得花时间学习!

最新更新