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

从列表中删除重复列表

从列表中删除重复列表

四季花海 2021-04-10 18:19:29
首先,我要承认已经问过这个问题,但是答案似乎过时或不令人满意。这个问题给出了一个未排序列表,如何才能以最有效,最优雅的方式删除重复项?(即使用最短的语法与最快的计算时间)例子:鉴于[[1,2,3],[],[2,-2],[3,2,1]],我们要[[1,2,3],[],[2,-2]]。请注意,是否[1,2,3]还是[3,2,1]无所谓。
查看完整描述

1 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

你可以做:


>>> li=[[1,2,3],[],[2,-2],[3,2,1]]

>>> {frozenset(e) for e in li}

{frozenset({1, 2, 3}), frozenset({2, -2}), frozenset()}

>>> [list(x) for x in {frozenset(e) for e in li}]

[[1, 2, 3], [2, -2], []]

关键是要使用,frozenset因为集合不可散列。请注意,此方法可能会更改顺序。


如果要保持相同的顺序,可以执行以下操作:


>>> seen=set()

>>> [e for e in li if frozenset(e) not in seen and not seen.add(frozenset(e))]

[[1, 2, 3], [], [2, -2]]

如果有重复的元素的可能性内的子列表,你可以在子列表排序,使用的是一个表示:


li=[[1,2,3],[],[2,-2],[3,2,1],[1,1,2,2,3],[1,2,1,2,3]]

seen=set()

nli=[]

for e in li:

    re=repr(sorted(e))

    if re not in seen:

        seen.add(re)

        nli.append(e)


>>> nli

[[1, 2, 3], [], [2, -2], [1, 1, 2, 2, 3]]

(注意:可以tuple代替使用,也可以repr根据需要使用。都可以产生可哈希的不可变结果)


查看完整回答
反对 回复 2021-04-20
  • 1 回答
  • 0 关注
  • 174 浏览
慕课专栏
更多

添加回答

举报

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