我试图找一个简短的方法来检查列表元素是否遵循如下的一般分布:
list = [1,3,5,7,9,11]
list [i]和list [i + 1]之间的区别显然是2,但我想要的功能还需要考虑列表[i + 1] - list [i]> = 2。
欢迎一个衬里或lambdas!
答案 0 :(得分:2)
试试这个:
>>> l = [1,3,5,6,8,10]
>>> all(y - x >= 2 for x, y in zip(l, l[1:]))
False
>>> l = [1,3,5,7,9,11]
>>> all(y - x >= 2 for x, y in zip(l, l[1:]))
True
如果内存是关注的话,像往常一样考虑izip
而不是zip
。
答案 1 :(得分:1)
比较list[i]
和list[i+1]
的明显方法是zip
列表及其1:
切片,然后遍历这些对:
for i, i1 in zip(lst, lst[1:]):
# stuff
例如,要找到最大差异:
maxdiff = max(i1-i for i, i1 in zip(lst, lst[1:]))
如果列表很大,或者您希望代码可以使用任何可迭代而不仅仅是序列,那么这有一些缺点。在这种情况下,您可以轻松编写一个产生相邻对的函数:
def pairs(i):
i = iter(i)
prev = next(i)
for x in i:
yield prev, x
prev = x
或者:
def pairs(i):
i1, i2 = tee(iter(i))
next(i2)
yield from zip(i1, i2)
答案 2 :(得分:0)
我可以尝试这种方式:
>>> lis = [1,3,5,6,8,10]
>>> all(map(lambda x: x[0+1] - x[0] >= 2, enumerate(lis)))
False
>>> all(map(lambda x: x[0+1] - x[0] >= 1, enumerate(lis)))
True
>>>
答案 3 :(得分:0)
我不确定你在寻找什么,但如果你的目标只是一个单一的内容来迭代列表并检查条件列表,那么理解是一个不错的选择。
[list[i+1] - list[i] >= 2 for i in range(len(list)-1)]
答案 4 :(得分:0)
尝试以下代码
def pairwise(l):
a,b = itertools.tee(l)
next(b,None)
return itertools.izip(a,b)
l = [1,3,5,6,8,10]
pairs = pairwise(iter(l))
print(list(itertools.ifilter(lambda i: i[1] - i[0] == 2,pairs)))
这是使用itertools。