【问题标题】:Is the order of results coming from a list comprehension guaranteed?来自列表理解的结果顺序是否得到保证?
【发布时间】:2021-03-16 12:29:27
【问题描述】:

当使用列表推导时,新列表的顺序是否有任何保证?作为一个人为的例子,列表理解的定义是否保证了以下行为:

>> a = [x for x in [1,2,3]]
>> a
[1, 2, 3]

同样,是否保证以下平等:

>> lroot = [1, 2, 3]
>> la = [x for x in lroot]
>> lb = []
>> for x in lroot:
     lb.append(x)
>> lb == la
True

具体来说,这是我感兴趣的顺序。

【问题讨论】:

  • 是的,这是有保证的。这是一个序列。

标签: python list-comprehension


【解决方案1】:

是的,列表推导保留了原始迭代的顺序(如果有的话)。 如果原始可迭代对象是有序的(列表、元组、文件等),那么这就是您在结果中得到的顺序。如果您的可迭代对象是无序的(set、dict 等),则无法保证项目的顺序。

【讨论】:

  • 有了集合和字典,我相信如果数据不改变,顺序就不会改变。例如给定一个集合s,以下将永远为真:[x for x in s] == [x for x in s]
  • 这是否也意味着理解的执行是按这个顺序执行的? IE。将 [x for x in s if p(x)] 以 s 的顺序调用 p(x) 或者可以(即使只是理论上)以不同的顺序调用 p(x) 并且结果以某种方式“排序”回到正确的顺序之后?
  • @JohnFouhy 是的,但它比 dicts 更细微。即使原始数据没有改变,顺序列表理解调用之间的输出顺序也会根据操作而改变(示例来自 B. Slatkin 的 Effective Python):chile_ranks = {'ghost': 1, 'habanero': 2, 'cayenne': 3}rank_dict = {rank: name for name, rank in chile_ranks.items()}print({name for name in rank_dict.values()})print({len(name) for name in rank_dict.values()})
【解决方案2】:

是的,列表就是一个序列。序列顺序很重要。

【讨论】:

    【解决方案3】:

    已经有一段时间了,但是由于我最近自己提出了一个类似的问题,并且需要更多的解释来理解这到底是什么,我会加上我的两分钱,希望它可以帮助其他人未来! :) 更具体地说,这是关于列表理解操作产生的值的顺序。


    假设您有以下列表:

    list_of_c = [a, b, c, d, e]
    

    我想使用以下列表理解舍入该列表中的变量:

    list_of_d = [round(value, 4) for value in list_of_c]
    

    我的问题是这是否意味着列表理解产生的顺序如下:

    list_of_d = [round_a, round_b, round_c, round_d, round_e]
    

    我从@juanpa.arrivillaga 那里得到了非常友好的回答,确实如此,是的就是这样!

    【讨论】:

      猜你喜欢
      • 2021-01-27
      • 1970-01-01
      • 2014-08-05
      • 1970-01-01
      • 2016-07-26
      • 2014-09-29
      • 1970-01-01
      相关资源
      最近更新 更多