我試圖找到一小段路,以檢查是否列表元素遵循一般般分佈:Python中,檢查列表如下分佈
list = [1,3,5,7,9,11]
列表[i]和表[我之間的區別+1]顯然是2,但我想要的功能需要考慮的還有列表[i + 1] - 列表[i]> = 2。
歡迎使用一條襯墊或羊肚菌!
我試圖找到一小段路,以檢查是否列表元素遵循一般般分佈:Python中,檢查列表如下分佈
list = [1,3,5,7,9,11]
列表[i]和表[我之間的區別+1]顯然是2,但我想要的功能需要考慮的還有列表[i + 1] - 列表[i]> = 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
是一個問題。
最顯而易見的方法來比較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)
我可以試試這個方法:
>>> 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
>>>
這是不必要的混淆,這使得很難意識到這是錯誤的。在每一個點上,你都在減去'lis [i] - i',所以你得到了'1,2,3,4,5',這兩個例子碰巧對這兩個例子都有正確的結果。 – abarnert 2014-12-01 23:47:57
我不知道你在找什麼,但如果你的目標只是一個襯墊來遍歷目錄,查看一個條件列表內涵是一個不錯的選擇。
[list[i+1] - list[i] >= 2 for i in range(len(list)-1)]
嘗試以下
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。
'list [i]'和'list [i + 1]'之間的區別並不總是2;它是'[2,2,1,2,2]'。 – abarnert 2014-12-01 23:41:05
'5,6'怎麼了?這不是2的差別。 – user2357112 2014-12-01 23:41:46
你能否準確描述你想要的功能? 「遵循像[東西]這樣的普遍分佈」有太多可能的解釋。 – user2357112 2014-12-01 23:42:49