比较列表中的项目

时间:2015-02-23 21:39:55

标签: python list comparison

如果我有一个清单

lst = [1, 2, 3, 4, 5]

我希望显示存在两个项目,其中一个项目比另一项项目大1,我可以这样做吗没有指定列表中的哪些项目?

即。无需执行以下操作:

lst[1] - lst[0] == 1 

适用于lst

中任何int项的通用代码

3 个答案:

答案 0 :(得分:1)

如果数字小于列表中的数字,您可以将数字配对:

new = [(i, i - 1) for i in lst if i - 1 in lst]

答案 1 :(得分:1)

这一个:为更快的成员检查制作列表集;然后短路检查列表中每个i + 1的集合中是否存在i(我迭代列表而不是新创建的集合,因为它应该稍快一些)。一旦证明任何i + 1也在列表中,该函数将以[{1}}返回值退出,否则为True

False

测试:

def has_n_and_n_plus_1(lst):
    lset = set(lst)
    return any(i + 1 in lset for i in lst)

一篮子脑筋急转弯的所有技巧:

>>> has_n_and_n_plus_1([6,2,7,11,42])
True
>>> has_n_and_n_plus_1([6,2,9,11,42])
False

此代码的作用是:按递增顺序对列表进行排序;然后进行from operator import sub from itertools import starmap, tee a, b = tee(sorted(lst)) next(b, None) exists = 1 in starmap(sub, zip(b, a)) 的成对迭代,然后将每个a, b = lst[i], lst[i + 1]的星图映射到b, a运算符,得到sub;然后使用b - a运算符检查生成的迭代器是否包含任何in

答案 2 :(得分:0)

您可以将列表自身移位一个拉链。

>>> lst = [1,2,3,4,5]
>>> zip(lst, lst[1:])
[(1, 2), (2, 3), (3, 4), (4, 5)]

这假设列表已订购。如果不是,那么您可以先对其进行排序,然后对其进行过滤以排除非匹配(如果这很重要,可能包括原始列表中的索引)。因此,如果它是一个更复杂的整数列表,那么它应该可以工作:

>>> lst = [99,12,13,44,15,16,45,200]
>>> lst.sort()
>>> [(x,y) for (x,y) in zip(lst, lst[1:]) if x + 1 == y]
[(12, 13), (15, 16), (44, 45)]

以下是等效的使用功能。使用izip itertools确保列表仅在我们查找与过滤函数匹配时迭代一次:

>>> from itertools import izip
>>> lst = [99,12,13,44,15,16,45,200]
>>> lst.sort()
>>> filter(lambda (x,y): x+1==y, izip(lst, lst[1:]))
[(12, 13), (15, 16), (44, 45)]

同样可以用于理解,但我个人更喜欢使用函数。