如果我有一个清单
lst = [1, 2, 3, 4, 5]
我希望显示存在两个项目,其中一个项目比另一项项目大1,我可以这样做吗没有指定列表中的哪些项目?
即。无需执行以下操作:
lst[1] - lst[0] == 1
适用于lst
答案 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)]
同样可以用于理解,但我个人更喜欢使用函数。