[英]Find “x” greatest differences in Python list
假設我有一個數據列表,例如股票價格,我想更多地了解列表中每個元素之間的差異,尤其是最大的差異。 在這種情況下,將發現變化最大的兩個價格(即最大的收益或損失)。
現在,我不只是想找到單一最大的區別。 我想找到5個最大的差異-用於計算差異的所有5對數字都是唯一的,並且不會收斂於相同的解決方案。
可以做到的一種方法是使用嵌套的for循環,如下所示:
nums = [1,2,3,4,5]
for i in nums:
for x in nums:
return x-i
但是我覺得這種方法確實很笨拙,無法解決當前的問題。 有一個更好的方法嗎? 謝謝!
編輯:
那些感興趣的人的解決方案
我使用了@Chris_Rands答案的修改版本來解決該問題。 基本上,此函數只是找出最大的差異,然后從原始列表中刪除每個元素,然后執行此過程,直到只剩下一個元素(當您找不到另一個差異時)。 結果是一個元組數組,其中包含與數據集最大差異的100%唯一對。
from itertools import combinations
from heapq import nlargest
nums = [98,34,513,352,3523,308,13]
def findTrades(list_, amount):
Trades_ = []
while len(list_) >= 2:
res = nlargest(1, combinations(list_, 2), key = lambda x: abs(x[0]-x[1]))
Trades_.append(res)
for i in res[0]:
list_ = [x for x in list_ if x != i]
return sorted(Trades_)[-amount:]
print (findTrades(nums, 3))
這里x=3
。 使用heapq.nlargest
優於對x
較小值進行排序。
>>> from itertools import combinations
>>> from heapq import nlargest
>>> nlargest(3, combinations(nums, 2), key = lambda x: abs(x[0]-x[1]))
[(1, 5), (1, 4), (2, 5)]
拿出Cartisean產品並使用max
:
from itertools import combinations
nums = [1,2,3,4,5]
max(combinations(nums,2), key=lambda t: abs(t[0]-t[1]))
# (1,5)
如果要按差異對它們進行排序:
sorted(combinations(nums,2), key=lambda t: abs(t[0]-t[1]), reverse=True)
[(1, 5), (1, 4), (2, 5), (1, 3), (2, 4), (3, 5), (1, 2), (2, 3), (3, 4), (4, 5)]
這是一個接受列表/元組並返回5個最大差異的函數。 注意,除了內置函數之外,此函數不使用任何其他依賴項。
用法:
differences(list_, length)
list_
是要檢查的輸入列表。
length
是您要記錄的差異數。
def differences(list_, length):
diffs = list(0 for _ in range(length))
for i, j in enumerate(list_):
for k in list_[i + 1:]:
if max(j, k) - min(j, k) > min(diffs):
diffs[0] = max(j, k) - min(j, k)
diffs = sorted(diffs)
return diffs
最大的5將是返回的值。 如果列表中只有3個項目產生3個差異,則最后兩個將為0,因為您無法使用此代碼獲得負差異。
如果我正確理解:
from operator import sub
from itertools import combinations
gen = sorted(set(abs(sub(*tup)) for tup in combinations(nums, 2)), reverse=True)
gen
[4, 3, 2, 1]
我將遍歷列表一次,在列表中找到3個最大的數字,在列表中找到3個最小的數字。 找到所有這些數字之間的差異,並采用3個最大的數字。 這樣可以確保您找到前5個最大的差異。
sol擁有所有五個最大的差異。 每次迭代時都替換最小差異。 應該簡單易懂。 (我沒有檢查邊緣情況和其他問題)
lis=[1,2,6,3,76,44,98,23,56,87,23,65,19,73]
sol=[0,0,0,0,0]
for i in range(len(lis)):
for j in range(len(lis)):
if abs(lis[i]-lis[j])>min(sol):
sol[sol.index(min(sol))]=lis[i]-lis[j]
print(sol)
#returned this [86, 97, 92, 96, 95]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.