2017-01-12 6 views
0

ich ein defaultdict haben, das so aussieht ...konvertieren eine dict auf eine Liste von Listen

defaultdict(int, 
       {" u'CAMILLE'": 10, 
       " u'SAHARA'": 1, 
       " u'JEREMIAH'": 114, 
       " u'EDISON'": 9, 
       ...} 

Ich brauche so etwas wie ...

[[u'CAMILLE', 10], 
[u'SAHARA', 1], 
[u'JEREMIAH',114], 
[u'EDISON', 9], 
...] 

beide

firstnames = [lambda x,y:list(x,y) for k,v in firstnames.items()] 

und

firstnames = [lambda x,y:[x,y] for k,v in firstnames.items()] 

produzieren

[<function __main__.<lambda>>, 
<function __main__.<lambda>>, 
<function __main__.<lambda>>, 
<function __main__.<lambda>>, 
...] 

die offensichtlich nicht, was ich die Absicht ist. Wie kann ich diesen Code korrigieren?

+0

Warum denkst du, du brauchst hier ein Lambda? –

+1

Was hat das mit [tag: apache-spark] zu tun? –

+0

Ich dachte, dass vielleicht die Umwandlung von defaultdicts in geschachtelte Listen in Spark üblich ist, da bestimmte Transformationen zu einem defaultdict führen ... dh "firstnames = babynames.map (Lambda X: x.First_Name) .countByValue()" aber dann "Vornamen .take (10) "wird nicht funktionieren, da defaultdicts keine" take "-Methode hat. – kjarsenal

Antwort

3

Es gibt keine Notwendigkeit lambda s zu verwenden:

firstnames = [[k,v] for k,v in firstnames.items()] 

oder noch kürzer:

firstnames = [list(t) for t in firstnames.items()] 

lambda eine anonyme Funktion erstellt. Das heißt, Sie haben eine Liste von Funktionen erzeugt, die als Eingabe zwei Parameter (hier x und y) übernehmen und eine Liste [x,y] zurückliefern. Die k und v werden in Ihrem Ansatz nicht einmal berücksichtigt.

+1

schlug mich jetzt in den Kopf für Dummheit. Arbeiten in Spark und vergessen, dass jede Berechnung keine Lambda-Funktion enthalten muss. – kjarsenal

2

Karte verwenden wird auch funktionieren:

firstnames = map(list, firstnames.items()) 

Beachten Sie, dass in python3 dies einen Generator bauen (so, wie Willem Kommentar sagt, es ist besser inmediatly list() rund um die Karte Aufruf zu verwenden, um die Werte bei genommen werden der Anrufmoment).

firstnames = list(map(list, firstnames.items())) 
+0

Beachten Sie, dass das Ergebnis nicht * materialisiert * wird. Wenn sich das Wörterbuch in der Zwischenzeit geändert hat, wird das Materialieren später fehlschlagen. Sie rufen wahrscheinlich sofort 'liste' um' map' auf. –

+0

@WillemVanOnsem, genau, krank füge es der Antwort hinzu – Netwave

Verwandte Themen