2016-11-20 3 views
0

Lange Rede kurzer Sinn, ich versuche, mit einigen verrückten Daten zu arbeiten, die ich gestern gesammelt habe. Eine schnelle geschachtelte for-Schleife würde das sehr einfach machen, aber gerade jetzt möchte ich nur das Verständnis meiner verschachtelten Listen nutzen. Es gibt eine Menge Post zu diesem Thema und ich bin mir nicht sicher, ob es nur ich oder der Freitagabend ist, ich kann es nicht zur Arbeit bringen. Meine Liste comphrension ist im Format:Verschachtelte Liste Verständnis mit Split() in Python

[ [str(j[0], sanitize(j[1]) for j in i.split(',')] for i in b] 

wo b ['string, float\t\n', 'string, float\t\n'] ist oder b könnte ein Dateiobjekt oder was auch immer sein, egal, ein Heck viel.

konnte ich einfach etwas tun, wie

for i in b: 
    out.append(str(j[0]), sanitize(j[1]) 

Aber sollte es möglich sein, durch Liste Verständnis. ES SOLLTE!!! Und irgendwie verstehe ich es nicht richtig.

nun auf dem, was ich bisher getan haben ...

>>> b 
['08:54:55, 0.031250\n', '08:55:57, 0.031250\n'] 

>>> [i.split(',') for i in b] 
[['08:54:55', ' 0.031250\n'], ['08:55:57', ' 0.031250\n']] 

Was ich will:

[['08:54:55', 0.031250], ['08:55:57', 0.031250]] 

Eine multiple Liste Verständnis der Trick tun sollten:

So etwas wie :

[ [j[0], j[1]] for j in i.split(',') for i in b] # the cleaning/str/float would be something like: str(j[0]), float(j[1]) 

ABER, das ist was ich bekomme.

>>> [ [j[0], j[1]] for j in i.split(',') for i in b] 
[['0', '8'], ['0', '8'], [' ', '0'], [' ', '0']] 
>>> 
>>> [ [j[1]] for j in i.split(',') for i in b] 
[['8'], ['8'], ['0'], ['0']] 

Jeder Versuch, an j [0] oder j [1] zu arbeiten, wird nicht ausgeführt.

, um herauszufinden, was los war, ich dies tat:

>>> [ [ pprint(type(j)) for j in i.split(',')] for i in b] 
<type 'str'> 
<type 'str'> 
<type 'str'> 
<type 'str'> 
[[None, None], [None, None]] 

Wenn ich mit j[0] oder j[1], verwirren nicht tun

>>> [ [ j for j in i.split(',')] for i in b] 
[['08:54:55', ' 0.031250\n'], ['08:55:57', ' 0.031250\n']] 

Das Beispiel mit pprint(type(j)) bedeutet auch, wenn ich Um eine externe Funktion zu schreiben, würde es nicht ausreichen. Ich würde einfach eine leere Liste aus dem Listenverständnis zurückholen.

Was mache ich falsch? Ein Lambda könnte den Trick machen?

Antwort

0

Sie können die split() ein zweites for Verständnis extra erstellen:

>>> [[t, sanitize(v)] for i in b for t, v in [i.split(',')]] 
[['08:54:55', 0.031250], ['08:55:57', 0.031250]] 
+0

Das funktioniert großartig. Wrapping i.split (',') in [] scheint den Job zu erledigen. –

1

Wenn du einen schreiben, Arbeits Schleife:

out = [] 

for i in b: 
    j = i.split(',') 
    out.append((j[0], sanitize(j[1]))) 

Sie werden feststellen, dass Sie irgendwo das Ergebnis i.split(',') speichern müssen sie Wiederholung zu vermeiden. Dies ist nicht inline in einem Listenverständnis möglich.Sie können eine Funktion schreiben:

def convert_thing(thing): 
    time, value = thing.split(',') 
    return time, sanitize(value) 

out = [convert_thing(x) for x in b] 

oder Zwischenwerte erzeugen (dies nicht tun):

out = [(time, sanitize(value)) for time, value in (x.split(',') for x in b)] 
# this bit is a generator expression    ^^^^^^^^^^^^^^^^^^^^^^^^^ 
+0

Nachdem Sie die Antwort von AChampion (siehe unten) gelesen haben, scheint es, dass Sie das Ergebnis speichern können, wenn Sie das Listenverständnis verstehen. Statt eines einfachen, a.split (',') musste ich [a.split (',')] machen. Nahm mich eine Weile, um das zu erkennen. –

+0

In [24]: [[j [0], j [1]] für j in [i.split (',')] für i in b] Aus [24]: [['08: 55: 57 ',' 0.03 \ n '], ['08: 55: 57', '0.03 \ n']] In [25]: [[j [0], float (j [1])] für j in [i.split (',')] für i in b] Heraus [25]: [['08: 55: 57 ', 0.03], ['08: 55: 57', 0.03]] –

+0

@JamesT: Das ist nur ein Zwei-Schleifen-Listenverständnis, ungefähr das gleiche wie das Schnipsel in meiner Antwort, das mit "tue das nicht" kommentiert wurde. Das "tue das nicht" gilt gleichermaßen für sie. – Ryan

Verwandte Themen