从文件读入字典,以及奇怪的eval()行为

时间:2016-03-01 18:54:21

标签: python file dictionary file-io eval

使用eval()ast.literal_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:6重写为2: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}}

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

2 个答案:

答案 0 :(得分:1)

缺少1:6的原因是因为您的字典中也有1:8,并且由于python使用哈希表来实现字典,因此它们不会保留重复的键(因为它们具有相同的哈希值)并且更改顺序的原因是dictionaries don't have a specific order,因为它们的实现方式。

答案 1 :(得分: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')