2016-03-01 59 views
1

使用eval()ast.literal_eval()(如其他人所建议的)从文件创建字典会产生奇怪的结果,我不知道为什么。从文件读取到字典和奇怪的eval()行为

我的文件,file.txt包含此:

{0 : {1: 6, 1:8}, 1 : {1:11}, 2 : {3: 9}, 3 : {},4 : {5:3},5 : {2: 7, 3:4}} 

我读入字典和打印内容进行这样

graph1 = {} 
graph1 = ast.literal_eval(open("file.txt").read()) 

,我得到这个东西,其中{1:6}丢失。

{0: {1: 8}, 1: {1: 11}, 2: {3: 9}, 3: {}, 4: {5: 3}, 5: {2: 7, 3: 4}} 

我改变 'file.txt的' 的内容是:

{0: {2: 7, 3: 4}, 1: {1: 11}, 2: {3: 9}, 3: {}, 4: {5: 3}, 5: {2: 7, 3: 4}} 

然后正确的内容显示!

然后我改变了file.txt这个内容,在这里我重写1:62:6

{0 : {2: 6, 1:8}, 1 : {1:11}, 2 : {3: 9}, 3 : {},4 : {5:3},5 : {2: 7, 3:4}} 

而这正是输出,其中{2:6}{1:8}开关的地方!

{0: {1: 8, 2: 6}, 1: {1: 11}, 2: {3: 9}, 3: {}, 4: {5: 3}, 5: {2: 7, 3: 4}} 

我想要做的就是正确地将一个文件的内容读入我的字典中。出了什么问题?

回答

1

Dictionaries不能有重复的key。如果向dict对象提供了相同的密钥,则前一个值将被较晚的值覆盖。

例如:

>>> d = {'a': 'x', 'b': 'y', 'c': 'z', 'a': 'w'} 
>>> d 
{'a': 'w', 'c': 'z', 'b': 'y'} # ('a': 'x') is overridden by ('a': 'w') 
1

错失1:6的原因是因为您的字典中也有1:8,并且由于python使用散列表实现字典,因此它们不保留重复键(因为它们具有相同的散列值)以及原因改变顺序是dictionaries don't have a specific order,因为它们的实施方式。