【问题标题】:How to remove duplicates from list of objects(according to value inside object), choosing item from dup’s according to other value inside object?如何从对象列表中删除重复项(根据对象内部的值),根据对象内部的其他值从 dup 中选择项目?
【发布时间】:2020-09-06 23:06:05
【问题描述】:

所以基本上,我有一个对象列表。假设每个对象有两个属性:A 和 B。A 是 3 个整数的元组:(A1, A2, A3),B 是整数。此列表可能包含具有相同 A 的对象,我想摆脱那些重复项。但是,我想这样做,在那些具有相同 A 的对象中,选择具有最低 B 的对象。最后,我想要一个包含所有唯一 A 和最低 B 的对象列表。

我想了一会儿,我想我可以用很多 for 循环想出一个非常笨拙的方法来做到这一点,但我觉得在 python 中的函数中必须有一个更好的方法或在某种图书馆中(至少完成其中的一部分)。有人有什么想法吗?

谢谢!

edit:更多细节,这实际上是针对俄罗斯方块 AI,用于查找给定棋子的所有可能动作。我的对象是可能的俄罗斯方块移动树中的节点。每个节点都有两个值:A:(x_position,y_position,rotation)和 B:到达该位置所需的帧数。我从起始位置的根节点开始。在每一步中,我通过向左移动一次、向右移动一次、向左旋转一圈、向右旋转一圈或向下软下拉来创建孩子来扩展树,并且对于每个孩子,我都会更新 A,XYR 位置和 B,到达那里所需的帧数。我将所有这些添加到潜在动作列表中。在此之后,我合并具有相同 XYR 位置的所有节点,选择具有最少帧的节点到达那里。下一步,我展开潜在移动列表中的每个节点并重复该过程。抱歉,我意识到这个解释可能令人困惑,这就是为什么我没有将它包含在原始解释中。我认为这样做是有利的,因为在现代俄罗斯方块中,有一个相当复杂的旋转系统,称为 SRS(超级旋转系统),它允许您使用各种部件执行复杂的旋转,因此通过以这种方式制作探路者并模拟根据 SRS 进行移动是一个好方法,因为它会告诉你移动是否是旋转(发送更多/更少的 dmg),它还可以让你知道执行放置的确切移动(我还存储了一个到达该位置的一系列移动列表)具有最少的帧。稍后,我希望能够弄清楚如何正确地对状态进行哈希处理,因此我不会重新访问,但我仍在弄清楚。

【问题讨论】:

  • 如果你真的给出一个实际数据的例子,以及你的过程会产生的实际结果,你的问题会更清楚。
  • 好的,我马上更新。
  • 我认为@DavidBuck 的“实际数据”并不意味着很长的数据描述。 :)
  • 你认为正确@timgeb
  • 啊,对不起,哈哈。由于 Mustafa 给出了有效的答案,我现在不会更新它,但下次我提出问题时我会记住它。

标签: python arrays list object


【解决方案1】:
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 的值中。

【讨论】:

  • 谢谢,这非常有帮助!我没想过用字典。事实上,我认为将我的列表完全变成字典并在每次添加另一个对象时使用此方法可能会更好。
猜你喜欢
  • 2019-10-26
  • 1970-01-01
  • 2020-06-02
  • 1970-01-01
  • 2021-07-09
  • 2012-09-14
  • 1970-01-01
  • 1970-01-01
  • 2023-02-23
相关资源
最近更新 更多