Ich habe eine Liste der Liste a wie folgt:

[[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']]

Ich muss die Duplikate und die Leerzeichen darin entfernen. Ich habe folgendes versucht:

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

Dies scheint aufgrund des Fehlers TypeError: unhashable type: 'list' nicht zu funktionieren. Ich habe versucht, die Liste in Tupel umzuwandeln, aber es hat auch nicht funktioniert.

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

Ich muss die Ordnung auch bewahren. Kann mir jemand dabei helfen?

Vielen Dank.

0
visakh 6 Dez. 2013 im 15:43

3 Antworten

Beste Antwort

Dies sollte es tun:

>>> 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']]

Ändern Sie x.strip() in nur if x, wenn Sie u' ' nicht als leere Zeichenfolge betrachten.

3
Ashwini Chaudhary 6 Dez. 2013 im 11:53

Sie können Ihre Liste durchlaufen und aus jedem Element einen Satz erstellen. Dann können Sie die leeren Werte über das Listenverständnis wie folgt filtern:

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']]

Um eine Bestellung beizubehalten, können Sie ein OrderedSet verwenden, das Sie hier finden ::

b = [[val for val in OrderedSet(inner_list) if val] for inner_list in a]
2
aga 6 Dez. 2013 im 12:26

Sie können itertools.chain.from_iterable verwenden:

>>> 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 ']
2
ndpu 6 Dez. 2013 im 11:54