首页 > 解决方案 > 从 n 个相等的项目中挑选与最小数字相关的项目

问题描述

我不知道如何解释这一点,但我会试一试。我有一个list1 = [('Lista-A', 2000), ('Lista-X', 1000), ('Lista-Z', 5000)])然后我会有一个

list2 = [['Lista-A', 2000.0],
 ['Lista-A', 1000.0],
 ['Lista-A', 666.6666666666666],
 ['Lista-A', 500.0],
 ['Lista-A', 400.0],
 ['Lista-A', 333.3333333333333],
 ['Lista-X', 1000.0],
 ['Lista-X', 500.0],
 ['Lista-X', 333.3333333333333],
 ['Lista-X', 250.0],
 ['Lista-X', 200.0],
 ['Lista-X', 166.66666666666666],
 ['Lista-Z', 5000.0],
 ['Lista-Z', 2500.0],
 ['Lista-Z', 1666.6666666666667],
 ['Lista-Z', 1250.0],
 ['Lista-Z', 1000.0],
 ['Lista-Z', 833.3333333333334]]

现在我需要从 list2 中选择 n 个最大的项目,但每次 2 或 3 个或更多项目具有相同的数值时,该函数将需要返回第一个列表并检查其中哪个项目具有最小的数值从具有相同值的项目中,它必须选择与第一个列表中数值最小的项目具有相同“名称”(Lista-A、Z 或 X)的项目。我不知道我需要做什么。我已经尝试对列表进行排序,但是我不知道继续前进。

对于这种情况,我需要 6 个最大值,所以预期的结果是

 list3 = [['Lista-Z', 5000.0],
 ['Lista-Z', 2500.0],
 ['Lista-A', 2000.0],
 ['Lista-Z', 1666.6666666666667],
 ['Lista-Z', 1250.0],
 ['Lista-x', 1000.0]]

标签: pythonpython-3.xlist

解决方案


可以做到这一点的一种方法是使用 NumPy 的lexsort. 首先,我将第一列映射到相应的数值:

>>> tiebreakers = dict(list1)
>>> arr = np.array([(tiebreakers[a], b) for (a, b) in list2])
>>> arr
array([[2000.        , 2000.        ],
       [2000.        , 1000.        ],
       [2000.        ,  666.66666667],
       [2000.        ,  500.        ],
       [2000.        ,  400.        ],
       [2000.        ,  333.33333333],
       [1000.        , 1000.        ],
       [1000.        ,  500.        ],
       [1000.        ,  333.33333333],
       [1000.        ,  250.        ],
       [1000.        ,  200.        ],
       [1000.        ,  166.66666667],
       [5000.        , 5000.        ],
       [5000.        , 2500.        ],
       [5000.        , 1666.66666667],
       [5000.        , 1250.        ],
       [5000.        , 1000.        ],
       [5000.        ,  833.33333333]])

然后您可以根据需要对数组进行排序lexsort

>>> order = np.lexsort((arr[:, 0], -arr[:, 1])) # Sorts by column 1 desc and column 0 asc
>>> order
array([12, 13,  0, 14, 15,  6,  1, 16, 17,  2,  7,  3,  4,  8,  5,  9, 10, 11])
>>> list3 = [list2[i] for i in order]
>>> list3[:6]
[['Lista-Z', 5000.0],
 ['Lista-Z', 2500.0],
 ['Lista-A', 2000.0],
 ['Lista-Z', 1666.6666666666667],
 ['Lista-Z', 1250.0],
 ['Lista-X', 1000.0]]

推荐阅读