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

Reading from file into dictionaries, and strange eval() behaviour

使用 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}}

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

缺少 1:6 的原因是因为您的字典中也有 1:8,并且由于 python 使用散列 table 来实现字典,他们不要保留重复键(因为它们具有相同的哈希值)并且更改顺序的原因是 因为它们的实现方式。

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')