如何从python中的列表中删除重复的元组?

时间:2018-01-17 11:51:38

标签: python list duplicates

我有一个包含元组列表的列表,如下所示。

mylist = [['xxx', 879], ['yyy', 315], ['xxx', 879], ['zzz', 171], ['yyy', 315]]

我想从mylist中删除重复的元组,并获得如下输出。

mylist = [['xxx', 879], ['yyy', 315], ['zzz', 171]]

似乎python中的set不起作用。

mylist = list(set(mylist))

有没有快速简便的方法在python中执行此操作(可能使用库)?

4 个答案:

答案 0 :(得分:5)

您无法执行此操作的原因是因为您有列表列表而不是元组列表。

你能做的是:

mytuplelist = [tuple(item) for item in mylist]
mylist = list(set(mytuplelist))

mylist = list(set(map(tuple, mylist)))

答案 1 :(得分:4)

您需要编写保留第一个子列表的代码,其余部分将丢弃。最简单的方法是反转mylist,将其加载到dict对象中,并再次将其键值对检索为列表。

>>> list(map(list, dict(mylist).items()))

或者,使用列表理解 -

>>> [list(v) for v in dict(mylist).items()]

[['zzz', 171], ['yyy', 315], ['xxx', 879]]

注意,这个答案没有维持秩序!此外,如果您的子列表可以包含2个以上的元素,那么如@JohnJosephFernandez' answer所示,一种涉及散列数据的tuplized版本的方法将是最好的选择。

答案 2 :(得分:4)

好像你想保留秩序。在这种情况下,您可以保留一个跟踪已添加列表的集合。

以下是一个例子:

failed_job

哪个输出:

mylist = [['xxx', 879], ['yyy', 315], ['xxx', 879], ['zzz', 171], ['yyy', 315]]

# set that keeps track of what elements have been added
seen = set()

no_dups = []
for lst in mylist:

    # convert to hashable type
    current = tuple(lst)

    # If element not in seen, add it to both
    if current not in seen:
        no_dups.append(lst)
        seen.add(current)

print(no_dups)

注意:由于列表不可清除,您可以将元组添加到[['xxx', 879], ['yyy', 315], ['zzz', 171]] 集。

答案 3 :(得分:2)

另一种选择:

>>> mylist = [['xxx', 879], ['yyy', 315], ['xxx', 879], ['zzz', 171], ['yyy', 315]]
>>> y = []
>>> for x in mylist:
...     if not x in y:
...             y+=[x]
...
>>> y
[['xxx', 879], ['yyy', 315], ['zzz', 171]]