2014-12-01 28 views
-2

我試圖找到一小段路,以檢查是否列表元素遵循一般般分佈:Python中,檢查列表如下分佈

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

列表[i]和表[我之間的區別+1]顯然是2,但我想要的功能需要考慮的還有列表[i + 1] - 列表[i]> = 2。

歡迎使用一條襯墊或羊肚菌!

+0

'list [i]'和'list [i + 1]'之間的區別並不總是2;它是'[2,2,1,2,2]'。 – abarnert 2014-12-01 23:41:05

+0

'5,6'怎麼了?這不是2的差別。 – user2357112 2014-12-01 23:41:46

+0

你能否準確描述你想要的功能? 「遵循像[東西]這樣的普遍分佈」有太多可能的解釋。 – user2357112 2014-12-01 23:42:49

回答

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

最顯而易見的方法來比較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) 
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 
>>> 
+0

這是不必要的混淆,這使得很難意識到這是錯誤的。在每一個點上,你都在減去'lis [i] - i',所以你得到了'1,2,3,4,5',這兩個例子碰巧對這兩個例子都有正確的結果。 – abarnert 2014-12-01 23:47:57

0

我不知道你在找什麼,但如果你的目標只是一個襯墊來遍歷目錄,查看一個條件列表內涵是一個不錯的選擇。

[list[i+1] - list[i] >= 2 for i in range(len(list)-1)] 
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。