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
解决这个问题的最恐怖的方法是什么?感谢。
答案 0 :(得分:7)
使用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