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

var*_*nie 6 python

from random import randrange
data = [(randrange(8), randrange(8)) for x in range(8)]
Run Code Online (Sandbox Code Playgroud)

我们必须测试第一个项目是否等于尾部之一.我很好奇我们怎么会做的最简单的方法不复制尾项新的名单?请考虑到这一段代码获取,比如说,update()方法执行多次,因此它必须是快速地.

使用额外的列表(不必要的内存浪费,我猜):

head = data[0]
result = head in data[1:]
Run Code Online (Sandbox Code Playgroud)

好的,这是另一种方式(太冗长):

i = 1
while i < len(data):
    result = head == data[i]
    if result:
        break
    i+=1
Run Code Online (Sandbox Code Playgroud)

解决这个问题的Pythonic方法是什么?谢谢.

aar*_*ing 7

Nick D的答案更好

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

import itertools

head = data[0]
result = head in itertools.islice(data, 1, None)
Run Code Online (Sandbox Code Playgroud)

进行演示:

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

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


Nic*_*kis 5

替代方式,

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


# 2
it = iter(data)
result = it.next() in it
Run Code Online (Sandbox Code Playgroud)