python - 从 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]]
解决方案
可以做到这一点的一种方法是使用 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]]
推荐阅读
- excel - Excel 条件格式 - 如果上面的未合并单元格符合条件,则最小值
- javascript - 当依赖于上下文状态时,反应停止组件的条件闪烁
- linux - 未能构建袖扣-2.2.1
- c# - 当我运行我的页面时,它返回一个 null 错误,就好像它没有捕获传入的信息一样
- c# - 如何使用流利断言断言一个集合是其他集合的子集合?
- bash - 当我想使用 bash 脚本在 tmux 中创建文件日志时应该怎么做?
- html - 如何使用 css 和 bootstrap 创建材料设计输入表单?
- ios - 每当收到通知时呈现 ViewController 会导致内存泄漏
- arrays - 表单数据以数组格式存储
- c++ - 链表 - 元素在删除后出现