删除模型对象列表中的重复项

时间:2018-01-20 12:07:29

标签: python list duplicates

我有一个来自模型对象的列表长度约为150万)。

class Word(object):
    def __init__(self, id, word, arg1 , arg2 )
        self.id = id
        self.word = word
        self.arg1 = arg1 
        self.arg2 = arg2 

有许多对象具有相同的word属性但id, arg1, arg2不同 例如:

1     hi        2      3
2     hi        4      6
3     hello     2      7
4     hi        2      7
5     world     1      9
6     hello     3      3
7     code      5      2

hi => 3hello => 2

如何通过word属性检查重复项目并以快速方式删除
请注意,篇幅太长

3 个答案:

答案 0 :(得分:4)

您只需要一个set。这是一个容器,只有一个具有相同键的对象可以存在。这是official documentation

您要做的是让您的Word课程可以播放

  • 它需要一个__eq__(otherword)方法,它接受另一个字,如果另一个字的.word等于它自己,则返回true,
  • 它需要一个__hash__方法来返回其内容的哈希值。我只是return self.word.__hash__()

然后,set确保每个单词只在那里一次。您也可以使用数学集(大括号{}中的内容)来组合,剪切,减去集合。

关于你的应用程序的一句话:在150万个对象中,真的看起来你应该有一个表而不是一个对象列表,因为这只意味着你真的有大约每个开销在表格中作为内容排列(如果不是更多)。

Python的“Pandas”模块可能就是这里使用的工具。它很可能会淘汰你到目前为止写的大部分内容。

答案 1 :(得分:2)

我发现转换为数据框并使用drop_duplicates easy。

使用:

DataFrame.drop_duplicates(subset=['word'], keep='first')

这将返回重复数据删除的数据帧,删除具有相同word属性的所有行,同时保留第一次出现。

  • 如果您希望删除最后一次出现的重复项,请使用keep='last'

  • 要删除所有重复项,请使用keep=False

答案 2 :(得分:1)

选项将使用此第三方库toolz

在您的情况下,您可以像这样使用它:

import toolz

unique_words = toolz.unique(words, key=lambda w: w.word)
# unique_words is a generator object

<强>输出:

>>> unique_words = toolz.unique(words, key=lambda w: w.word)
>>> for w in unique_words:
...     print(w.word)
... 
hi
hello
world
code