Python list(set(list(...)) 删除重复项

RFl*_*ack 5 python list set

list(set(some_list))
Run Code Online (Sandbox Code Playgroud)

从列表中删除重复项的好方法?(如果重要的话,Python 3.3)

(编辑以解决一些评论......之前可能太简洁了)。

具体来说,

  • 如果不比编写自己的算法更好,它是否至少在效率(主要是速度和内存)方面具有可比性;这显然是最简洁的代码
  • 它可靠吗?任何情况下它会破裂?(已经提到了一个......列表项需要是可散列的)
  • 有没有更Pythonesque的方式来做到这一点?

Mar*_*som 5

您展示的方法可能是最短且最容易理解的;这将使大多数定义成为 Pythonic。

如果需要保留列表的顺序,可以使用collections.OrderedDict代替set

list(collections.OrderedDict((k, None) for k in some_list).keys())
Run Code Online (Sandbox Code Playgroud)

编辑:从 Python 3.7(或 3.6,如果您信任)开始,没有必要使用OrderedDict; 常规dict共享保留广告订单的属性。所以你可以重写上面的:

list({k: None for k in some_list}.keys())
Run Code Online (Sandbox Code Playgroud)

如果元素不可散列但可以排序,则可以使用itertools.groupby删除重复项:

list(k for k,g in itertools.groupby(sorted(some_list)))
Run Code Online (Sandbox Code Playgroud)

编辑:以上可以写成列表理解,有些人可能认为它更像 Pythonic。

[k for k,_ in itertools.groupby(sorted(some_list))]
Run Code Online (Sandbox Code Playgroud)