【问题标题】:How to find the minimum from a matrix in multiple lists in python?python - 如何从python的多个列表中的矩阵中找到最小值?
【发布时间】:2020-11-30 04:54:51
【问题描述】:

我有 3 个价格清单:

iexMin =  [20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20]
withLimit =  [0.649, 1.298, 1.298, 2.538, 2.596, 2.596, 2.560, 2.560, 0.560, 1.682, 1.682, 2.242, 2.242, 2.242, 2.287, 2.592, 2.388, 2.98, 3.29, 3.299]
beyondLimit =  [0.66, 2.30134, 2.30155, 2.30171, 2.955, 2.51, 2.519, 2.51, 1.749, 1.749, 1.749, 1.745, 1.749, 1.82208, 1.8993, 1.899, 2.29657, 2.29659, 2.29692, 2.30931]

我将它们分成 4 组,每组 5 个元素,然后按降序对它们进行排序,以从每个列表中获取最小的前 4 分钟值,然后从所有列表中比较所有最小值:

n = 5
a = [iexMin[i:i + n] for i in range(0, len(iexMin), n)]
b = [withLimit[i:i + n] for i in range(0, len(iexMin), n)]
c = [beyondLimit[i:i + n] for i in range(0, len(iexMin), n)]

testList1 = [sorted(block)[:4] for block in a]
testList2 = [sorted(block)[:4] for block in b]
testList3 = [sorted(block)[:4] for block in c]

price1 = [item for t in testList1 for item in t]
price2 = [item for t in testList2 for item in t]
price3 = [item for t in testList3 for item in t]

minRate = [min(price1[i],price2[i],price3[i]) for i in range(len(price1))]

输出:

min rate =  [0.649, 1.298, 1.298, 2.30171, 0.56, 1.682, 2.51, 2.51, 1.682, 1.749, 1.749, 1.82208, 1.899, 2.29657, 2.29659, 2.29692]

这个输出的唯一问题是我没有在这里比较整个矩阵。正如我所说的,一开始我将列表分成 5 个元素的 4 个块,所以基本上我想一次比较整个块和每个块的 5 分钟值。所以预期的输出将如下所示:

IEXMin = [[20, 20, 20, 20], [20, 20, 20, 20], [20, 20, 20, 20], [20, 20, 20, 20]]
withinLimit = [[0.649, 1.298, 1.298, 2.538], [0.56, 1.682, 2.56, 2.56], [1.682, 2.242, 2.242, 2.242], [2.388, 2.592, 2.98, 3.29]]
beyondLimit = [[0.66, 2.30134, 2.30155, 2.30171], [1.749, 1.749, 2.51, 2.51], [1.745, 1.749, 1.749, 1.82208], [1.899, 2.29657, 2.29659, 2.29692]]

##Expected Answer##
min rate =  [0.649, 0.66, 1.298, 1.298, 0.56, 1.682, 1.749, 1.749, 1.682, 1.745, 1.749, 1.749, 1.899, 2.29657, 2.29659, 2.29692]

如您所见,我实际上想一次比较块并从每个块中获取前 4 分钟的值。有人可以帮忙吗?

【问题讨论】:

    标签: python python-3.x list numpy sorting


    【解决方案1】:

    我认为您做了一些额外的工作,因此使事情变得复杂。这是解决它的一种方法:

    使用您的代码:

    n = 5
    a = [iexMin[i:i + n] for i in range(0, len(iexMin), n)]
    b = [withLimit[i:i + n] for i in range(0, len(iexMin), n)]
    c = [beyondLimit[i:i + n] for i in range(0, len(iexMin), n)]
    
    

    那么,

    minRate = [sorted(a+b+c)[:4] for a,b,c in zip(a, b, c)]
    minRate = [item for each in minRate for item in each]
    print(minRate)
    

    输出: [0.649, 0.66, 1.298, 1.298, 0.56, 1.682, 1.749, 1.749, 1.682, 1.745, 1.749, 1.749, 1.899, 2.29657, 2.29659, 2.29692]

    您原始代码中的错误是您正在比较三个列表(最后一行)中相同索引处的元素,然后增加索引。

    更新:sorted(a+b+c) 是如何工作的?

    首先,列表推导中的a,b,c 对应于您定义的列表abc 的块。我只是发现重用 a,b,c 更方便,但我肯定可以使用更好的名称。

    现在,+ 运算符实际上将列表连接在一起。例如,[1,1]+[1,1] 将提供[1,1,1,1]。所以我将这些块连接为一个,然后对它们进行排序并选择最低的 4-sorted(a+b+c)[:4]

    使用 numpy 时的注意事项:将 + 运算符与 numpy 数组一起使用会将它们添加为向量。由于在这里我可以从您的理解中推断出它不是一个 numpy 数组,因此我使用 Python 列表运算符 + 来获得所需的结果。

    【讨论】:

    • 嘿,非常感谢你,但我有一个疑问,如果你能帮助我,那会更有帮助。 sorted(a+b+c) 是如何工作的?我的意思是如何从每个块中搜索最小值?
    • 我希望答案的更新可以消除您的疑问:)
    猜你喜欢
    • 2017-04-02
    • 2017-07-21
    • 1970-01-01
    • 2021-04-27
    • 2021-07-02
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多