我有一个包含元组列表的列表,如下所示。
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中执行此操作(可能使用库)?
答案 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]]