【问题标题】:Initialising Python dictionary with list comprehension使用列表理解初始化 Python 字典
【发布时间】:2020-01-01 13:29:31
【问题描述】:

我随机编写了这段代码,试图学习理解,但现在我无法理解代码中发生了什么。

lst = "this is really strange behaviour".split()
dt = dict({i,j} for i,j in enumerate(lst))
print(dt)

我试图制作一个字典,其中键为整数,值作为对应的单词。但是这段代码的输出是

{0: 'this', 1: 'is', 2: 'really', 'strange': 3, 4: 'behaviour'}

我不明白为什么有些键是数字而有些是字符串。 附:我什至不明白为什么这种语法是正确的并且没有错误。 请解释一下。对不起我的英语不好。

【问题讨论】:

    标签: python-3.x dictionary list-comprehension


    【解决方案1】:

    {i,j} 创建一个集合。集合没有继承顺序,所以集合有时是i, j,有时是j, idict 始终使用“第一个”(最左侧)值作为键,使用“第二个”作为值。这意味着有时i 被选为关键,有时j 是。

    改用有序的数据结构,例如元组:

    dt = dict((i, j) for i, j in enumerate(lst))
    #         ^    ^  note parenthesis to create tuple, not braces
    

    那么dt 将永远是

    {0: 'this', 1: 'is', 2: 'really', 3: 'strange', 4: 'behaviour'}
    

    您实际上可以跳过(i, j) for i, j in enumerate(lst),这实际上并没有什么用处,直接使用

    dt = dict(enumerate(lst))
    

    在这里使用集合没有任何意义。由于集合的元素是唯一的,因此如果列表包含恰好等于其索引的数字,则此代码将中断,例如:

    lst = ['a', 1]
    dt = dict({i, j} for i, j in enumerate(lst))
    

    会报错

    ValueError: dictionary update sequence element 1 has length 1; 2 is required
    

    因为{1, 1} 变为{1}dict 需要一个键值对序列。

    【讨论】:

    • 通常print({2,'really'}, {0,'this'}, {3,'strange'}) 总是打印预期的内容(即 int 后跟 string )?为什么这里的订单不随时更改?
    • @Harshraj 做了足够多的时间,你会发现有时顺序确实会改变。我刚刚打印了{'really', 2} {0, 'this'} {3: 'strange'}
    • 哦,是的,经过大量设置后,我看到了这种效果。谢谢@DeepSpace
    猜你喜欢
    • 1970-01-01
    • 2016-04-27
    • 2021-08-21
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多