首先让我承认之前已经提出这个问题,但答案似乎过时或不满意.问题是一个未排序列表的列表,我们如何以最有效和优雅的方式删除重复项?(即使用最短的语法与最快的计算时间)
例:
鉴于[[1,2,3],[],[2,-2],[3,2,1]],我们想要[[1,2,3],[],[2,-2]].需要注意的是不论[1,2,3]或[3,2,1]无所谓.
你可以做:
>>> 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], []]
Run Code Online (Sandbox Code Playgroud)
关键是要使用,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]]
Run Code Online (Sandbox Code Playgroud)
如果有重复的元素的可能性内的子列表,你可以在子列表排序,使用的是一个表示:
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]]
Run Code Online (Sandbox Code Playgroud)
(注意:您可以tuple改为使用或repr根据需要使用.或者生成可散列的不可变结果)
| 归档时间: |
|
| 查看次数: |
102 次 |
| 最近记录: |