将列表中的项目与其他项目进行比较

2024-04-26 18:06:30 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我有名单

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

我想说明存在两个项目,其中一个比另一个大1,我能做这个而不指定列表中的哪些项目吗?你知道吗

也就是说,不必做以下事情:

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

适用于lst中任何int项的通用代码


Tags: 项目代码列表事情int名单lst
3条回答

你可以将列表压缩,使其自身移动1。你知道吗

>>> 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)]

以下是使用函数的等效方法。使用来自itertoolsizip可以确保在查找与filter函数匹配的项时,只对列表进行一次迭代:

>>> 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)]

同样的方法也可以用于理解,但我个人更喜欢使用函数。你知道吗

这个:为更快的成员检查创建一个列表集;然后为列表中的每个i短路检查该集中是否存在i + 1(我迭代列表而不是新创建的集,因为它应该稍微快一点)。一旦证明任何i + 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操作符检查结果迭代器是否包含任何1。你知道吗

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

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

相关问题 更多 >