簡體   English   中英

在Python列表中找到“ x”最大的不同

[英]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個最大的差異。

您可以嘗試使用矩陣:

l = np.array([1,2,3,4])
a = np.tile(l,(len(l),1))
a - a.T

在此處輸入圖片說明

這將為您提供每兩對元素之間的差異。 現在,您可以選擇最大的n對。

b.ravel()[np.argsort(b.ravel())][-4:]將為您提供最大的4個值

數組([1,2,2,3])

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM