删除Python中列表中的重复项和空白

时间:2013-12-06 11:43:52

标签: python

我有一个列表a,如下所示:

[[u'Apple', '', u'Apple Inc', u'Apple', u'shares ', u'Amazon', u'Amazon', u'Amazon', '', '', u'Apple', u'Kindle', u'iPad', u'Amazon', u'Amazon', '', u'Amazon', u'Kindle', u'Amazon', '', u'iPad', u'iPad', u'iPad', u'Kindle', u'Kindle', u'Nook', u' ', u'sales', '', '', u'Amazon', '', '', '', '', '', ''], [u'United Kingdom', ''], [u'LA']]

我需要删除重复项和空白。我尝试了以下方法:

a_1 = filter(None,a)
a_2 = list(set(a_1))

由于错误TypeError: unhashable type: 'list',这似乎不起作用。我试图将列表转换为元组,但它也没有用。

a_1 = set(map(tuple,a))
a_2 = map(list,a_1)

我也必须保留订单。有人可以帮我解决这个问题。

感谢。

3 个答案:

答案 0 :(得分:3)

这应该这样做:

>>> lis = [[u'Apple', '', u'Apple Inc', u'Apple', u'shares ', u'Amazon', u'Amazon', u'Amazon', '', '', u'Apple', u'Kindle', u'iPad', u'Amazon', u'Amazon', '', u'Amazon', u'Kindle', u'Amazon', '', u'iPad', u'iPad', u'iPad', u'Kindle', u'Kindle', u'Nook', u' ', u'sales', '', '', u'Amazon', '', '', '', '', '', ''], [u'United Kingdom', ''], [u'LA']]
def solve(lis):
    for seq in lis:
        seen = set()
        yield [x for x in seq if x.strip() and x not in seen and not seen.add(x)]

>>> list(solve(lis))
[[u'Apple', u'Apple Inc', u'shares ', u'Amazon', u'Kindle', u'iPad', u'Nook', u'sales'],
 [u'United Kingdom'],
 [u'LA']]

如果您不认为x.strip()为空字符串,请将if x更改为u' '

答案 1 :(得分:2)

您可以遍历列表,从中列出每个元素。然后你可以通过列表理解来过滤空白值,如下所示:

a = [[u'Apple', '', u'Apple Inc', u'Apple', u'shares ', u'Amazon', u'Amazon', u'Amazon', '', '', u'Apple', u'Kindle', u'iPad', u'Amazon', u'Amazon', '', u'Amazon', u'Kindle', u'Amazon', '', u'iPad', u'iPad', u'iPad', u'Kindle', u'Kindle', u'Nook', u' ', u'sales', '', '', u'Amazon', '', '', '', '', '', ''], [u'United Kingdom', ''], [u'LA']]
b = [[val for val in set(inner_list) if val] for inner_list in a] # b is [[u'iPad', u'Apple', u' ', u'sales', u'Nook', u'Amazon', u'Apple Inc', u'Kindle', u'shares '], [u'United Kingdom', ''], [u'LA']]

要保留订单,您可以使用可以找到的OrderedSet here

b = [[val for val in OrderedSet(inner_list) if val] for inner_list in a]

答案 2 :(得分:2)

您可以使用itertools.chain.from_iterable

>>> import itertools
>>> a1=[[u'Apple', '', u'Apple Inc', u'Apple', u'shares ', u'Amazon', u'Amazon', u'Amazon', '', '', u'Apple', u'Kindle', u'iPad', u'Amazon', u'Amazon', '', u'Amazon', u'Kindle', u'Amazon', '', u'iPad', u'iPad', u'iPad', u'Kindle', u'Kindle', u'Nook', u' ', u'sales', '', '', u'Amazon', '', '', '', '', '', ''], [u'United Kingdom', ''], [u'LA']]
>>> list(set(e for e in itertools.chain.from_iterable(a1) if e))
[u'iPad', u' ', u'Apple', u'LA', u'sales', u'Nook', u'United Kingdom', u'Amazon', u'Apple Inc', u'Kindle', u'shares ']