2013-12-06 3 views
0

У меня есть список из списка a следующим образом:Удаление дубликатов и пробелы в списке списка в Python

[[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) 

Я также должен сохранить заказ. Может кто-то помочь мне с этим.

Спасибо.

+0

Возможный дубликат [Python: удаление дубликатов из списка списков] (http://stackoverflow.com/questions/2213923/python-removing-duplicates-from-a-list-of-lists) – Mark

ответ

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' ' пустая строка.

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

Вы можете использовать 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 '] 
Смежные вопросы