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

时间:2018-12-01 00:01:13

标签: python python-3.x python-2.7

我正在尝试从文件中提取数据,将其放入列表中,将该列表放入字典中,然后将该字典附加到具有相应键名的更大字典中。到目前为止,一切正常,除了值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)

1 个答案:

答案 0 :(得分:0)

在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]

来源:Objects and References

bigDictionary的键分配给worddict时,将创建对worddict的引用,这意味着worddict更改时,{{1}中的对应值}更改为新的bidDictionary

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

bidDictionary

另一种选择是每次循环(documentation)时使用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的副本。

作为建议,Pandas library非常适合使用csv文件。花时间学习非常值得!