2017-01-31 5 views
2

Ich muß zählt die folgende Liste zu transformieren:Python verschachtelte Liste Verständnis Vorkommen gleicher Zeichenfolge in Listen

[ 
    [u'starred', u'review'], 
    [u'starred', u'review'], 
    [u'starred', u'review', u'pinned'], 
    [u'starred'], 
    [u'starred'], 
    [u'starred', u'review'] 
] 

in die folgenden dict

{ 
    u'starred': 6, 
    u'review': 4, 
    u'pinned': 1 
} 

ich das Gefühl habe, dass es sein sollte möglich sein, indem man Listenverständnis oder einen Generatorausdruck verwendet, aber ich bin mir nicht sicher.

Irgendwelche Ideen?

Antwort

6

Wie wäre es

import itertools, collections 
c = collections.Counter(itertools.chain(*your_list)) 
+0

Das ist perfekt. Wird auf andere Antworten warten, bevor Sie es annehmen. –

+2

Statt 'chain (* your_list)' könnte man 'chain.from_iterable (your_list)' verwenden, aber das ist nur ein kleiner Punkt. Gute Antwort! – MSeifert

+0

Wow, nach weniger als 2 Minuten schon 5 upvotes? Das ist schnell. – ChatterOne

1

Flatten Sie Liste mit Generator Ausdruck und verwenden collections.Counter:

from collections import Counter 

Counter(x for sub in L for x in sub) 
+0

Zwei Gründe für die Annahme dieser Antwort: In erster Linie ist es schneller. In einem schnellen Benchmark erhalte ich 1,08 sec für diesen einen vs 1,42 mit dem 'itertools.chain'. Zweitens: Obwohl es nicht so wichtig ist und die 'itertools' Antwort sauberer ist (einfacher zu verstehen bei einer kurzen Glypse), ist dies immer noch die Antwort, die zeigt, wie Verschachtelte Listenverständnis/Generatorausdrücke tatsächlich verwendet werden. –

+0

@DanielF Was ist dein Maßstab? Für '[map (unicode, range (1000)) für _ in range (1000)]' ist der 'itertools' für mich schneller (ungefähr 2,71 Sekunden vs. 2,99 Sekunden (für zehn Ausführungen)). –

+0

Ich bin for-Bereich (1000) -looping ein Ergebnis eines Datenbank-Abrufs. Wenn Sie möchten, kann ich das Datenbankergebnis in eine JSON-Datei schreiben und sie in Pastebin posten. Außerdem verlasse ich den Counter-Call. 'list (itertools.chain (* your_list))' vs '[x für sub in your_list für x in sub]'. Ich werde später noch einmal überprüfen, um Sie nicht zu belasten. Danke für die Information. –

Verwandte Themen