假设我有一个数据列表...例如股票价格,我想了解更多关于列表中每个元素之间的差异 - 特别是最大的差异。在这种情况下,它将找到表现出最大变化(即最大 yield 或损失)的 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))
请您参考如下方法:
此处 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)]
