我不知道如何解释这一点,但我会试一试。我有一个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]]