<p>首先,我想强调使用<code>set</code>当然不是反模式。<code>set</code>s在O(n)时间内消除重复,这是您所能做的最好的方法,而且比将每个项目与其他项目进行比较的朴素的O(n^2)解决方案要好得多。它甚至比排序更好——事实上,似乎您的数据结构<em>甚至可能没有一个自然的顺序,在这种情况下,排序没有多大意义。在</p>
<p>在这种情况下使用集合的问题是必须定义一个自定义的<code>__hash__</code>方法。也有人这么说。但是你是否能轻松做到这一点是一个开放的问题——这取决于你的实际类的细节,你还没有告诉我们。例如,如果上面的<code>Foo</code>对象的任何属性都是不可哈希的,那么创建一个自定义哈希函数将非常困难,因为您不仅要为<code>Foo</code>对象编写自定义哈希,还必须为其他每种类型的对象编写自定义哈希!在</p>
<p>所以如果你想要一个结论性的答案,你需要告诉我们更多关于你的类有什么样的属性。但我可以提供一些推测。在</p>
<p><em>假设</em>可以为<code>Foo</code>对象编写散列函数<em>,但也假设<code>Foo</code>对象是可变的,因此,正如Niklas B.所指出的,这是一种可行的方法。创建一个函数<code>freeze</code>,给定<code>Foo</code>的可变实例,该函数返回<code>Foo</code>中不可变的数据集合。例如,假设Foo中有一个<code>dict</code>和一个<code>list</code>;<code>freeze</code>返回一个<code>tuple</code>的<code>tuple</code>(表示<code>dict</code>)和另一个<code>tuple</code>(表示<code>dict</code>)和另一个{<cd15>}(表示<code>list</code>)。函数<code>freeze</code>应具有以下属性:</p>
<pre><code>freeze(a) == freeze(b)
</code></pre>
<p>当且仅当</p>
^{pr2}$
<p>现在通过以下代码传递您的列表:</p>
<pre><code>dupe_free = dict((freeze(x), x) for x in dupe_list).values()
</code></pre>
<p>现在你有了一个无重复的列表。(实际上,在添加了这个建议之后,我看到<a href="https://stackoverflow.com/a/10536073/577088">fraxel</a>也提出了类似的建议;但是我认为使用自定义函数甚至是方法<code>(x.freeze(), x)</code>是更好的方法,而不是像他那样依赖<code>__dict__</code>,这可能不可靠。您的自定义<code>__eq__</code>方法也是如此,IMO--<code>__dict__</code>并不总是一个安全的快捷方式,因为各种原因我无法进入这里。)</p>
<p>另一种方法是首先只使用不可变的对象!例如,可以使用<a href="http://docs.python.org/dev/library/collections.html#collections.namedtuple" rel="nofollow noreferrer">^{<cd26>}</a>s。下面是从python文档中窃取的一个示例:</p>
<pre><code>>>> Point = namedtuple('Point', ['x', 'y'])
>>> p = Point(11, y=22) # instantiate with positional or keyword arguments
>>> p[0] + p[1] # indexable like the plain tuple (11, 22)
33
>>> x, y = p # unpack like a regular tuple
>>> x, y
(11, 22)
>>> p.x + p.y # fields also accessible by name
33
>>> p # readable __repr__ with a name=value style
Point(x=11, y=22)
</code></pre>