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

J C*_*ena 3 python list duplicates

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

mylist = [['xxx', 879], ['yyy', 315], ['xxx', 879], ['zzz', 171], ['yyy', 315]]
Run Code Online (Sandbox Code Playgroud)

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

mylist = [['xxx', 879], ['yyy', 315], ['zzz', 171]]
Run Code Online (Sandbox Code Playgroud)

好像set在python中它不起作用.

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

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

cs9*_*s95 5

您需要编写保留第一个子列表的代码,其余部分删除。执行此操作的最简单方法是反转mylist,将其加载到dict对象中,然后再次将其键值对作为列表检索。

>>> list(map(list, dict(mylist).items()))
Run Code Online (Sandbox Code Playgroud)

或者,使用列表推导 -

>>> [list(v) for v in dict(mylist).items()]
Run Code Online (Sandbox Code Playgroud)

[['zzz', 171], ['yyy', 315], ['xxx', 879]]
Run Code Online (Sandbox Code Playgroud)

请注意,此答案不维护顺序!另外,如果您的子列表可以包含两个以上的元素,那么最好的方法就是像@JohnJosephFernandez的回答所示的那样,对数据的郁金香化版本进行哈希处理。


Roa*_*ner 5

看来您想保留订单。在这种情况下,您可以保留一个集合,以跟踪添加了哪些列表。

这是一个例子:

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)
Run Code Online (Sandbox Code Playgroud)

哪些输出:

[['xxx', 879], ['yyy', 315], ['zzz', 171]]
Run Code Online (Sandbox Code Playgroud)

注意:由于列表不可散列,因此可以将元组添加到seen集合中。


Joh*_*des 5

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

你能做的是:

mytuplelist = [tuple(item) for item in mylist]
mylist = list(set(mytuplelist))
Run Code Online (Sandbox Code Playgroud)

要么

mylist = list(set(map(tuple, mylist)))
Run Code Online (Sandbox Code Playgroud)