【问题标题】:Removing duplicates from list based on custom definition of duplicate根据重复的自定义定义从列表中删除重复项
【发布时间】:2015-09-12 21:32:32
【问题描述】:

我正在处理一个看起来像这样的嵌套列表。

mylist =[
    ["First", "Second", "Third"], 
    ["First", "Second", "Third"], 
    ...
]

目标是根据以下定义删除 mylist 的重复元素:如果 element1[0] == element2[0]element1[1] == element2[1],则一个元素等于另一个元素。基本上,只计算前两个元素,忽略其余元素。

这似乎并不难,但我可能过于复杂并且遇到了麻烦。我想我已经接近了一个解决方案,如果它完成并且没有人回答,我会发布。

我的主要问题:

我真的希望我可以像在更传统的情况下那样将列表变成一个集合——有没有办法给集合一个自定义的等价定义?许多内置方法因此不起作用,重写它们有点痛苦,因为索引总是在某个地方搞砸了。

【问题讨论】:

  • 如果你有名单[[1,2,4],[1,2,3]],你在乎这两个中的哪一个幸存下来吗?
  • 我应该澄清一下:不,任何一个幸存者都可以。

标签: python list duplicates duplicate-removal nested-lists


【解决方案1】:

您可以创建一个存储数据的类并覆盖__eq__

class MyListThingy(object):
    def __init__(self, data):
        self.data = data
    def __eq__(self, other):
        return self.data[0]==other.data[0] and self.data[1]==other.data[1]

当然,这对使用散列的集合没有任何好处。为此,您必须覆盖 __hash__:

def __hash__(self):
    return hash((self.data[0],self.data[1]))

【讨论】:

  • 这听起来不错。但是,给 set() 一个 MyListThingy 对象列表会引发一个不可哈希的实例错误(使用类中的 __hash 函数)。
  • 糟糕,我的意思是__hash__
  • 啊,现在完美运行,我以为您想将 hash 编写为私有方法(我认为 __ 用于表示?)。这是非常好的解决方案,我会记住的,谢谢。
【解决方案2】:

您可以从内部列表中创建一个包含第一项和第二项的元组,以用作字典中的键。然后将所有内部列表添加到字典中,这将导致删除重复项。

d = dict()
l =[["First", "Second", "Third"], ["First", "Second", "Fourth"]]
for item in l:
      d[(item[0], item[1])]=item

输出:( d.values() )

[['First', 'Second', 'Fourth']]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 2016-10-15
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多