使用自定义比较删除重复项

Cha*_*l72 17 python python-3.x

从列表中删除重复项最方便的"Pythonic"方法基本上是:

mylist = list(set(mylist))
Run Code Online (Sandbox Code Playgroud)

但是假设您计算重复项的标准取决于包含在其中的对象的特定成员字段mylist.

好吧,一个解决方案就是定义__eq____hash__使用对象mylist,然后经典list(set(mylist))将起作用.

但有时您的要求需要更多的灵活性.能够创建动态lambda以使用自定义比较例程以不同方式识别重复项将非常方便.理想情况下,例如:

mylist = list(set(mylist, key = lambda x: x.firstname))
Run Code Online (Sandbox Code Playgroud)

当然,这实际上并不起作用,因为set构造函数不采用比较函数,并且还set需要可散列密钥.

那么实现类似的东西的最接近的方法是什么,以便您可以使用任意比较函数删除重复项?

int*_*jay 22

您可以使用dict而不是set,其中dict的键将是唯一值:

d = {x.firstname: x for x in mylist}
mylist = list(d.values())
Run Code Online (Sandbox Code Playgroud)

  • 哇我之前从未见过`{x.firstname:x for x in mylist}`的语法.它叫什么,我在哪里可以找到它. (2认同)
  • @MarwanAlsabbagh:这是[dict comprehension](http://www.python.org/dev/peps/pep-0274/).它是在Python 2.7和3.0中添加的.它相当于`dict((x.firstname,x)for m in mylist)`. (2认同)