【问题标题】:Does Python sorted() actually CHANGE the list being sorted?Python sorted() 实际上会改变被排序的列表吗?
【发布时间】:2015-06-08 19:07:10
【问题描述】:
rat_nreads = sorted([(self.markers2lens[m],n) for m,n in self.markers2nreads.items()],key = lambda x: x[1])
rat_nreads, removed = [], []

我看到了这段代码,真的很困惑;如果要立即将rat_nreads 分配给已排序列表,那么将其分配给空列表有什么意义?第一行是否真的以任何方式改变了self.markers2nreads.items()

【问题讨论】:

  • 如果要就地排序,请使用<list>.sort()
  • 您尝试过文档docs.python.org/2/library/functions.html#sorted 吗? 从可迭代的项目中返回一个新的排序列表。这是第一行
  • 谢谢!我目前正在阅读一段用于查找微生物组成的代码(MetaPhlan2),当我看到我发布的代码时,我真的很困惑。

标签: python sorted


【解决方案1】:

不,sorted 创建一个新列表。

所以你发布的代码没有意义。

第一行是否真的以任何方式改变了self.markers2nreads.items()

它不能改变,因为你有一个使用它的列表理解。

注意事项:

  • 将列表传递给sorted 是没有意义的。 sorted(((self.markers2lens[m],n) for m,n in self.markers2nreads.items()),key = lambda x: x[1]) 效率更高——使用了生成器,没有临时列表。
  • 您应该使用dict.iteritems(),因为dict.items() 也会创建一个不需要的列表。

要对列表进行适当的排序,需要这样做:

_list = [(self.markers2lens[m], n) for m, n in self.markers2nreads.iteritems()]
_list.sort(key=lambda x: x[1])

【讨论】:

  • 好的,非常感谢!我以为我快疯了。哇,我喜欢stackoverflow
【解决方案2】:

项目保留在内存中的相同位置,但会创建一个新列表:

a = [1, 0, 2]
a1 = id(a[0])

b = sorted(a)
b1 = id(b[1])

print a1 == b1
>>>True

希望这会有所帮助..

【讨论】:

  • 项目'1'的内存地址保持不变,即使在排序之后也是如此。这就是我的观点
  • 很明显,这不是重点! a1==b1 因为它们的内存地址相同,id(a[0]) 或 id(b[1]) 分别是列表 a 和列表 b 中项 '1' 的内存地址
  • 我认为这些项目并没有改变只是将项目包装在内存中的列表
猜你喜欢
  • 1970-01-01
  • 2022-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
  • 2011-11-25
  • 2010-11-09
相关资源
最近更新 更多