以Pythonic的方式拿着列表的尾巴?

时间:2010-10-11 04:12:09

标签: python

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

解决这个问题的最恐怖的方法是什么?感谢。

2 个答案:

答案 0 :(得分:7)

Nick D的答案更好

使用islice。它不会复制列表,并且基本上将您的第二个(优雅但冗长的)解决方案嵌入到C模块中。

import itertools

head = data[0]
result = head in itertools.islice(data, 1, None)

演示:

>>> a = [1, 2, 3, 1]
>>> head = a[0]
>>> tail = itertools.islice(a, 1, None)
>>> head in tail
True

请注意,你只能遍历一次,但如果你想做的就是检查头部是否在尾部并且你担心记忆,那么我认为这是最好的选择。

答案 1 :(得分:5)

替代方式,

# 1
result = data.count(data[0]) > 1


# 2
it = iter(data)
result = it.next() in it