Найдите "x" самые большие различия в списке Python - PullRequest
0 голосов
/ 04 января 2019

Допустим, у меня есть список данных ... скажем, цены на акции, например, и я хочу узнать больше о различиях между каждым элементом списка - особенно о самых больших различиях.В этом случае было бы найти 2 цены, которые демонстрируют наибольшее изменение (т.е. наибольшую прибыль или убыток).

Теперь я не просто хочу найти единственное число наибольшую разницу,Я хочу найти, возможно, 5 самых больших различий - где все 5 пар чисел, используемых для вычисления разности, уникальны и не сходятся в одном решении.

Один из способов сделать это - использовать вложенные циклы forвот так:

nums = [1,2,3,4,5]

for i in nums:
    for x in nums:
        return x-i

Но я чувствую, что этот метод действительно неуклюж и не решает вопрос под рукой.Есть лучший способ сделать это?Спасибо!

Редактировать:

Решение для заинтересованных

Я использовал модифицированную версию ответа @Chris_Rands, чтобы решитьпроблема.По сути, эта функция просто находит единственное наибольшее различие, а затем удаляет каждый элемент из исходного списка и выполняет этот процесс до тех пор, пока не останется только 1 элемент (если вы не можете найти другую разность).В результате получается массив кортежей, содержащий 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))

Ответы [ 7 ]

0 голосов
/ 04 января 2019

Вы можете попробовать использовать матрицы:

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

enter image description here

Это даст вам разницу между каждыми двумя парами элементов.Теперь вы можете выбрать самые большие n пар.

b.ravel()[np.argsort(b.ravel())][-4:] даст вам 4 самых больших значения

массив ([1, 2, 2, 3])

0 голосов
/ 04 января 2019

соль содержит все пять самых больших отличий.Я заменяю минимальную разницу каждый раз во время итерации.Должно быть простым для понимания.(Я не проверял крайние случаи и другие проблемы)

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]
0 голосов
/ 04 января 2019

Здесь 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)]
0 голосов
/ 04 января 2019

Возьмите картезианский продукт и используйте 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)]
0 голосов
/ 04 января 2019

Если я правильно понимаю:

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]
0 голосов
/ 04 января 2019

Вот функция, которая принимает список / кортеж и возвращает 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, поскольку вы не можете получить отрицательную разницу с этим кодом.

0 голосов
/ 04 января 2019

Я бы перебрал список один раз и нашел бы 3 самых больших числа в списке и 3 самых маленьких числа в списке.Найдите различия между всеми этими числами и возьмите 3 самых больших.Это будет эффективным и гарантирует, что вы нашли 5 крупнейших различий.

...