从文件读入字典,以及奇怪的 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')
使用 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')