从列表

时间:2015-06-15 05:12:50

标签: python numpy

我有一个如下列表:

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有更好的方法

3 个答案:

答案 0 :(得分:4)

列表不是" hashable"类型,不能是集合的成员。

冻结集可以,所以我们首先转换为那些(也使子列表顺序不变),然后转换回列表。

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

或者如果您更喜欢理解,

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

我怀疑numpy提供任何"更好" (对某些更好的定义)方式。

这种方式是IMO最清晰,最pythonic。

原因列表不能是集合的一部分,因为它们是可变的,所以现在散列与散列后的散列不同;在基于散列的集合中会导致令人困惑的行为。

答案 1 :(得分:0)

#!/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']]

答案 2 :(得分:0)

最简单直接的方法是使用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']]