Python,检查列表是否遵循分发

时间:2014-12-01 23:38:50

标签: python numpy

我试图找一个简短的方法来检查列表元素是否遵循如下的一般分布:

list = [1,3,5,7,9,11]

list [i]和list [i + 1]之间的区别显然是2,但我想要的功能还需要考虑列表[i + 1] - list [i]> = 2。

欢迎一个衬里或lambdas!

5 个答案:

答案 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。