首页 > 解决方案 > 如何从对象列表中删除重复项(根据对象内部的值),根据对象内部的其他值从 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),它还可以让你知道执行放置的确切移动(我还存储了一个到达该位置的一系列移动列表)具有最少的帧。后来,我希望能够弄清楚如何正确地散列状态,所以我不

标签: pythonarrayslistobject

解决方案


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


推荐阅读