繁体   English   中英

从列表中删除重复的子列表

[英]Removing repeated sub-lists from a list

我的清单如下:

l = [['A', 'C', 'D'], ['B', 'E'], ['A', 'C', 'D'], ['A', 'C', 'D'], ['B', 'E'], ['F']]

结果应为:

[['A', 'C', 'D'], ['B', 'E'], ['F']]

元素的顺序也不重要。

我尝试为:

print list(set(l))

numpy有更好的方法吗

列表不是“可哈希”类型,不能是集合的成员。

冻结的集合可以,因此我们首先转换为那些集合(也使子列表具有顺序指示性),然后再转换回列表。

print map(list, set(map(frozenset, l)))

或者,如果您更喜欢理解,

print [list(x) for x in {frozenset(x) for x in l}]

我怀疑numpy提供了任何“更好”(为了更好的定义)方式。

这种方式是IMO最清晰,最Python的。


原因列表之所以不能成为集合的一部分是因为它们是可变的,因此散列现在与更改后的散列不同。 处于基于哈希的集合中会使行为混乱。

#!/usr/bin/python

l1 = [['A', 'C', 'D'], ['B', 'E'], ['A', 'C', 'D'], ['A', 'C', 'D'], ['B', 'E'], ['F']]
l2=[]

for l in l1:
    if l not in l2:
        l2.append(l)

print l2

输出值

[['A', 'C', 'D'], ['B', 'E'], ['F']]

无需将非可哈希类型转换为可哈希类型,反之亦然(这会对性能产生影响)的最简单直接的方法是使用itertools.groupby

偏离航线,将不会保留订单,但是无论如何OP都会明确指出这不是严格的要求

>>> l = [['A', 'C', 'D'], ['B', 'E'], ['A', 'C', 'D'], ['A', 'C', 'D'], ['B', 'E'], ['F']]
>>> from itertools import groupby
>>> [k for k, g in groupby(sorted(l))]
[['A', 'C', 'D'], ['B', 'E'], ['F']] 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM