我有一个如下列表:
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有更好的方法
答案 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']]