【问题标题】:Reading from file into dictionaries, and strange eval() behaviour从文件读入字典,以及奇怪的 eval() 行为
【发布时间】:2016-03-01 18:54:21
【问题描述】:

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

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

【问题讨论】:

    标签: python file dictionary file-io eval


    【解决方案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') 
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-12
        • 2018-03-14
        • 1970-01-01
        • 2021-06-22
        • 2021-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多