从 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]]

如果我理解正确

list1 = [('Lista-A', 2000), ('Lista-X', 1000), ('Lista-Z', 5000)]
list1 = dict(list1)  #Converted to dict for easy lookup
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.sort(key=lambda x: (x[1], -list1.get(x[0], x[0])), reverse=True)
print(list2[: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]]

一种方法是使用 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]]

最新更新