python - 如何从对象列表中删除重复项(根据对象内部的值),根据对象内部的其他值从 dup 中选择项目?
问题描述
所以基本上,我有一个对象列表。假设每个对象有两个属性:A 和 B。A 是 3 个整数的元组:(A1, A2, A3),B 是整数。此列表可能包含具有相同 A 的对象,我想摆脱那些重复项。但是,我想这样做,在那些具有相同 A 的对象中,选择具有最低 B 的对象。最后,我想要一个包含所有唯一 A 和最低 B 的对象列表。
我想了一会儿,我想我可以想出一个非常笨拙的方法来用很多 for 循环来做到这一点,但我觉得在 python 或某种函数中必须有一个更好的方法图书馆(至少做这件事的一部分)。有人有想法么?
谢谢!
编辑:有关更多详细信息,这实际上是针对俄罗斯方块 AI,用于查找给定棋子的所有可能动作。我的对象是可能的俄罗斯方块移动树中的节点。每个节点都有两个值:A:(x_position,y_position,rotation)和 B:到达该位置所需的帧数。我从起始位置的根节点开始。在每一步,我通过向左移动一次、向右移动一次、向左旋转一圈、向右旋转一圈或向下软下拉来扩展树,并为每个孩子更新 A,XYR 位置和 B,到达那里所需的帧数。我将所有这些添加到潜在动作列表中。在此之后,我合并具有相同 XYR 位置的所有节点,选择具有最少帧的节点到达那里。下一步,我展开潜在移动列表中的每个节点并重复该过程。抱歉,我意识到这个解释可能令人困惑,这就是为什么我没有将它包含在原始解释中。我认为这样做是有利的,因为在现代俄罗斯方块中,有一个相当复杂的旋转系统,称为 SRS(超级旋转系统),它允许您使用各种部件执行复杂的旋转,因此通过以这种方式制作探路者并模拟根据 SRS 进行移动是一个好方法,因为它会告诉你移动是否是旋转(发送更多/更少的 dmg),它还可以让你知道执行放置的确切移动(我还存储了一个到达该位置的一系列移动列表)具有最少的帧。后来,我希望能够弄清楚如何正确地散列状态,所以我不
解决方案
d = {}
for obj in the_list:
current_lowest = d.setdefault(obj.A, obj)
if obj.B < current_lowest.B:
d[obj.A] = obj
# Get the result
desired_list = list(d.values())
我们有一个字典d
,其键是元组 ( A
),值是对象本身。.setdefault
确保如果A
尚未看到感兴趣的对象,则将其设置为当前对象obj
。如果它已经被看到,它会返回对应于那个的值(一个对象)A
。然后我们将该对象B
与手头的对象进行比较,并根据情况采取行动。最后,所需的结果将在于 的值d
。
推荐阅读
- function - Powershell:每次从函数运行时添加数据的函数
- html - 服务现在在 IE11 中提供空的推荐人
- c# - 如何阻止 0 出现在我的数组中
- java - 为什么我必须将 GeoFireStore 中的集合和文档名称预先设置为 setlocation
- c++ - C++ 如何正确限制 FPS(使用 GLFW)
- python - 无法与 discord.py 中的自定义表情符号做出反应:(错误代码:10014):未知表情符号
- python - 熊猫在尝试将所有 csv 合并为一个 csv 时生成一个空 csv
- python - 如何根据与值的辅助数据框匹配的条件填充主数据框列中的 NaN 以使用多个填充值填充 NaN
- javascript - 我如何从java脚本中的方括号中获取数据
- python-3.x - 如何获取系列的元素索引