2016-11-20 4 views
0

Короче говоря, я пытаюсь работать с некоторыми сумасшедшими данными, собранными вчера. Быстрое вложенное для цикла будет делать это очень просто, но прямо сейчас, я просто хочу, чтобы мое вложенное понимание списка работало. На эту тему есть куча сообщений, и я не уверен, что это только я или из-за пятничного вечера, я не могу заставить его работать. Мой список comphrension в формате:Вложенное понимание списка с помощью split() в python

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

где Ь ['string, float\t\n', 'string, float\t\n'] или б может быть объектом файла или любой другой, не имеет значения, чертовски много.

я мог бы просто сделать что-то вроде

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

Но это должно быть возможным список понимания. ДОЛЖНО!!! И почему-то я не понимаю.

Теперь, на то, что я сделал до сих пор ...

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

Что я хочу:

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

Многократная список понимание должно сделать трюк:

Что-то вроде :

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

НО, это то, что я получаю.

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

Любые попытки работать с j [0] или j [1] не выдаются.

Чтобы выяснить, что происходит, я сделал это:

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

Если я не связывайтесь с j[0] или j[1],

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

Пример с pprint(type(j)) означает, что даже если бы я был чтобы написать внешнюю функцию, это не сделало бы трюк. Я просто получаю пустой список из понимания списка.

Что я делаю неправильно? Лямбда может сделать трюк?

ответ

0

Вы можете создать вторую for понимание к дополнительной split():

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

Это отлично работает. Обертка i.split (',') в [], похоже, выполняет эту работу. –

1

Если выписать правильный, рабочий цикл:

out = [] 

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

вы заметите, что вам нужно где-то хранить результат i.split(','), чтобы избежать повторения этого. Это невозможно сделать в одном понимании списка.Вы можете написать функцию:

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

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

или генерировать промежуточные значения (не делать этого):

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

Пройдя ответ AChampion (см. Ниже), кажется, что вы действительно можете сохранить результат при составлении списка. Вместо простого a.split (',') мне пришлось делать [a.split (',')]. Понадобился время, чтобы понять это. –

+0

В [24]: [[j [0], j [1]] для j в [i.split (',')] для i в b] Выход [24]: [[088: 57: 57] ',' 0.03 \ n '], ['08: 55: 57', '0.03 \ n']] В [25]: [[j [0], float (j [1])] для j в [i.split (',')] для i в b] Выход [25]: [[088: 57, 0,03], ['08: 55: 57 ', 0.03]] –

+0

@JamesT: Это всего лишь двухточечное понимание списка, примерно так же, как и фрагмент в моем ответе, аннотированный «не делай этого». «Не делай этого» в равной степени относится к нему. – Ryan

Смежные вопросы