2024-04-26 18:06:30 发布
网友
如果我有名单
lst = [1, 2, 3, 4, 5]
我想说明存在两个项目,其中一个比另一个大1,我能做这个而不指定列表中的哪些项目吗?你知道吗
也就是说,不必做以下事情:
lst[1] - lst[0] == 1
适用于lst中任何int项的通用代码
lst
你可以将列表压缩,使其自身移动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)]
以下是使用函数的等效方法。使用来自itertools的izip可以确保在查找与filter函数匹配的项时,只对列表进行一次迭代:
itertools
izip
>>> 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。你知道吗
i
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。你知道吗
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]
你可以将列表压缩,使其自身移动1。你知道吗
这假设列表是有序的。如果不是,那么您可以先对它排序,然后过滤它以排除不匹配项(如果这很重要的话,可能包括原始列表中的索引)。如果是一个更复杂的整数列表,这应该可以:
以下是使用函数的等效方法。使用来自
itertools
的izip
可以确保在查找与filter函数匹配的项时,只对列表进行一次迭代:同样的方法也可以用于理解,但我个人更喜欢使用函数。你知道吗
这个:为更快的成员检查创建一个列表集;然后为列表中的每个
i
短路检查该集中是否存在i + 1
(我迭代列表而不是新创建的集,因为它应该稍微快一点)。一旦证明任何i + 1
也在列表中,函数就会退出,返回值为True
,否则返回值为False
。你知道吗测试:
一篮子脑筋急转弯一:
这段代码的作用是:按递增顺序对列表排序;然后对
a, b = lst[i], lst[i + 1]
进行成对迭代,然后将每个b, a
星图映射到sub
操作符中,得到b - a
;然后用in
操作符检查结果迭代器是否包含任何1
。你知道吗如果列表中的数字小于该数字,则可以配对:
相关问题 更多 >
编程相关推荐