检查列表中是否有相邻的整数相等

bos*_*son 2 python list

如果我有一个清单

a = [9,4,3,6,4,4,3,6,4] 
Run Code Online (Sandbox Code Playgroud)

如何检查两个相邻元素是否相同?例如,对于索引4和5处的元素(两者都具有值4)将是如此.

Emi*_*röm 5

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和运行时间.

  • 在这里使用`any`稍微简单一些,并且使用带有`map`的`lambda`总是最糟糕的选择(带有C内置的`map`可以是好的,否则,使用生成器表达式).在这种情况下,`map`可以更好地工作,不需要使用`operator.eq`来实现`zip`:`from operator import eq`,`hasEqualNeighbors = any(map(eq,a,a [1:] ))`.如果在Python 2上,首先执行`from future_builtins import map`以获取基于`map`的生成器(因此`any`可以提早出来,并且一旦它命中就避免进一步检查). (3认同)

Bha*_*rel 5

对于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 中的事实映射返回一个列表而不是迭代器。