如果我有一个清单
a = [9,4,3,6,4,4,3,6,4]
Run Code Online (Sandbox Code Playgroud)
如何检查两个相邻元素是否相同?例如,对于索引4和5处的元素(两者都具有值4)将是如此.
pairs = zip(a, a[1:]) # Create tuples of neighbours
equals = map(lambda (x, y): x == y, pairs) # List of booleans which tells whether tuple elements are equal or not
hasEqualNeighbours = any(equals) # Is there a True boolean in the list?
Run Code Online (Sandbox Code Playgroud)
或者导入eq函数并使用而不是lambda,并意识到map可以一次遍历多个列表,因此您不需要zip:
from operator import eq
hasEqualNeigbours = any(map(eq, a, a[1:]))
Run Code Online (Sandbox Code Playgroud)
from future_builtins import map如果你在Python 2 上,你也可以使用它.这使得map一个懒惰的迭代器而不是构建整个对的列表,从而节省了RAM和运行时间.
对于Python 3.x来说,这是一种关于内存和执行时间的有效方法。
import itertools
import operator
if any(map(operator.eq, a, itertools.islice(a, 1, None))):
print("There are equal neighbhors")
Run Code Online (Sandbox Code Playgroud)
itertools.islice()创建一个迭代器,对序列进行切片而不创建新序列。map()然后每次检查operator.eq()序列中的项目和后面的项目是否相等。
any()然后迭代地图并返回(如果有)True。
然而,对于Python 2.x,我建议这样做:
import itertools
import operator
if any(itertools.imap(operator.eq, a, itertools.islice(a, 1, None))):
print("There are equal neighbhors")
Run Code Online (Sandbox Code Playgroud)
由于 Python 2.x 中的事实映射返回一个列表而不是迭代器。