我有一个来自模型对象的列表(长度约为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 => 3
和hello => 2
如何通过word
属性检查重复项目并以快速方式删除
请注意,篇幅太长
答案 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