删除列表中重复的元组和列表

我在 python 中有一个元组和列表列表:

gammagammalambda = [[[('p', 'u'), ('r', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]], [[('p', 'w'), ('r', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]], [[('r', 'u'), ('p', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]], [[('r', 'w'), ('p', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]]]

哪里

[[('p', 'u'), ('r', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]]

是一样的

[[('r', 'w'), ('p', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]]

所以现在,我想删除这些双重元素,以便有

[[[('p', 'u'), ('r', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]], [[('p', 'w'), ('r', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]]]

为此,我想使用列表理解,并且我已经尝试过

main_set = set(tuple(frozenset(innermost_list) for innermost_list in sublist) for sublist in gammagammalambda)

但我收到错误:

TypeError: unhashable type: 'list'

希望,你能帮助我。


弑天下
浏览 188回答 2
2回答

墨色风雨

一种替代方法如下:gammagammalambda = [[[('p', 'u'), ('r', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]],                    [[('p', 'w'), ('r', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]],                    [[('r', 'u'), ('p', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]],                    [[('r', 'w'), ('p', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]]]d = {frozenset(e[0]) : e for e in reversed(gammagammalambda)}result = list(d.values())print(result)输出[[[('p', 'u'), ('r', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]], [[('p', 'w'), ('r', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]]]创建一个字典,其中键代表必须唯一的值,对于每个键设置为 value 的整个元素gammagammalambda,最后唯一的值是字典的值d。或者更直接的选择:gammagammalambda = [[[('p', 'u'), ('r', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]],                    [[('p', 'w'), ('r', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]],                    [[('r', 'u'), ('p', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]],                    [[('r', 'w'), ('p', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]]]seen = set()result = []for e in gammagammalambda:    key = frozenset(e[0])    if key not in seen:        result.append(e)        seen.add(key)print(result)输出[[[('p', 'u'), ('r', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]], [[('p', 'w'), ('r', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]]]

BIG阳

与此答案类似,list不可散列,tuple并且frozenset 是可散列的。您可以相应地定义一个“唯一键”,并使用itertools unique_everseenrecipe,也可以在 3rd 方库中作为toolz.unique或 使用more_itertools.unique_everseen:from more_itertools import unique_everseenL = [[[('p', 'u'), ('r', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]],     [[('p', 'w'), ('r', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]],     [[('r', 'u'), ('p', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]],     [[('r', 'w'), ('p', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]]]def unique_everseen(x):    return frozenset(x[0]), tuple(map(tuple, x[1][0]))res = list(unique(L, key=unique_key))[[[('p', 'u'), ('r', 'w')], [[[], ['q', 's'], ['t', 'v'], [ ]]]], [[('p', 'w'), ('r', 'u')], [[[], ['q', 's'], ['t', 'v'], [] ]]]]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python