为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

弑天下 2021-08-24 15:33:46
我在 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'希望,你能帮助我。
查看完整描述

2 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

一种替代方法如下:


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'], []]]]]



查看完整回答
反对 回复 2021-08-24
?
BIG阳

TA贡献1859条经验 获得超6个赞

与此答案类似,list不可散列,tuple并且frozenset 是可散列的。


您可以相应地定义一个“唯一键”,并使用itertools unique_everseenrecipe,也可以在 3rd 方库中作为toolz.unique或 使用more_itertools.unique_everseen:


from more_itertools import unique_everseen


L = [[[('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'], [] ]]]]


查看完整回答
反对 回复 2021-08-24
  • 2 回答
  • 0 关注
  • 187 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信