【发布时间】:2011-04-23 15:21:30
【问题描述】:
from random import randrange
data = [(randrange(8), randrange(8)) for x in range(8)]
我们必须测试第一项是否等于一个尾巴。我很好奇,我们如何以最简单的方式做到这一点而不将尾部项目复制到新列表中?请考虑到这段代码在 update() 方法中执行了很多次,因此它必须尽可能快。
使用额外的列表(我猜是不必要的内存浪费):
head = data[0]
result = head in data[1:]
好的,这是另一种方式(太冗长):
i = 1
while i < len(data):
result = head == data[i]
if result:
break
i+=1
解决这个问题的最 Pythonic 方法是什么?谢谢。
【问题讨论】:
-
简单地说
result = data[0] in data[1:]有什么问题?如果执行in查询,列表切片只是一个迭代器,而不是一个副本。 -
哎呀。我不知道。任何文档都说明了这一点?
-
@Aram Dulyan,什么版本的 python?当我以您描述的方式切割足够大的列表(大约一千万个元素)时,我可以在系统监视器上看到我的内存跳跃。我也需要看一些文档才能相信这一点。
-
遗憾的是,获取元组的切片也会导致内存跳跃(Python 2.6)。我会认为不可变序列的切片将通过包装支持序列来实现。
-
lst = [1, 1]; it = iter(lst[1:]); lst[1] = 2; it.next()给出1,再次建议/确认切片运算符确实为迭代目的创建了原始列表的副本。
标签: python