Python - 快速删除列表中的重复项?

5
你知道,要将列表转换为:
a = ["hello", "hello", "hi", "hi", "hey"]

转换为列表:

b = ["hello", "hi", "hey"]

你可以这样做:
b = list(set(a))

它快速且符合Python的风格。

但是如果我需要将这个列表:

a = [["hello", "hi"], ["hello", "hi"], ["how", "what"], ["hello", "hi"], 
     ["how", "what"]] 

to:

b = [["hello", "hi"], ["how", "what"]]

什么是Python的惯用方式来处理这个问题?
3个回答

14
>>> a = [["hello", "hi"], ["hello", "hi"], ["how", "what"], ["hello", "hi"], ["how", "what"]]
>>> set(map(tuple, a))
set([('how', 'what'), ('hello', 'hi')])

1

还有另一种方法,虽然不太好(但只要对象是可排序的,它就适用于无法哈希的对象)

>>> from itertools import groupby
>>> a = [["hello", "hi"], ["hello", "hi"], ["how", "what"], ["hello", "hi"], ["how", "what"]]
>>> [k for k, g in groupby(sorted(a))]
[['hello', 'hi'], ['how', 'what']]

+1 是因为他是唯一一个没有将列表转换为元组的人。他的示例具有列表的列表而不是元组的列表。 - Phil Cooper

0

如果需要保留原始顺序并且您使用的是Python 2.7+

>>> from collections import OrderedDict
>>> a = [["hello", "hi"], ["hello", "hi"], ["how", "what"], ["hello", "hi"], ["how", "what"]]
>>> list(OrderedDict.fromkeys(map(tuple, a)))
[('hello', 'hi'), ('how', 'what')]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接