Повторение цикла Python с заменой нулевых значений во временных рядах списка - PullRequest
0 голосов
/ 28 сентября 2018

Мне нужно заменить нулевые значения значением из списка ниже в Python.Значение будет одинаковым для любого элемента в списке, если оно не равно нулю.

пример списка

[[1538140080000, None], [1538140140000, None], [1538140200000, None], [1538140260000, None], [1538140320000, None], [1538140380000, 92881926.0], [1538140440000, 92881926.0]]

Я хотел бы получить вывод равным

[[1538140080000, 92881926.0], [1538140140000, 92881926.0], [1538140200000, 92881926.0], [1538140260000, 92881926.0], [1538140320000, 92881926.0], [1538140380000, 92881926.0], [1538140440000, 92881926.0]]

В списке любой из (ключ, значение) будет иметь требуемое значение (кроме нуля), которое я хочу заменить для всех ключей списка.

Ответы [ 5 ]

0 голосов
/ 28 сентября 2018

Получите значение, которое не является None, поскольку оно может быть только одним значением, которое мы можем использовать set

Переопределить элементы в l как [i[0], *value]

value = set([y for x, y in l if y != None])
l = [[i[0], *value] for i in l]
[[1538140080000, 92881926.0], [1538140140000, 92881926.0], [1538140200000, 92881926.0], [1538140260000, 92881926.0], [1538140320000, 92881926.0], [1538140380000, 92881926.0], [1538140440000, 92881926.0]]
0 голосов
/ 28 сентября 2018

Если вы счастливы использовать стороннюю библиотеку, Pandas предлагает векторизованные методы:

import pandas as pd

L = [[1538140080000, None], [1538140140000, None], [1538140200000, None],
     [1538140260000, None], [1538140320000, None], [1538140380000, 92881926.0],
     [1538140440000, 92881926.0]]

res = pd.DataFrame(L).bfill().ffill().values.tolist()

print(res)

[[1538140080000.0, 92881926.0], [1538140140000.0, 92881926.0], [1538140200000.0, 92881926.0],
 [1538140260000.0, 92881926.0], [1538140320000.0, 92881926.0], [1538140380000.0, 92881926.0],
 [1538140440000.0, 92881926.0]]
0 голосов
/ 28 сентября 2018

понимание списка может легко сделать работу

l = [[q if q else 0 for q in i] for i in l]

Вывод

[[1538140080000, 0], [1538140140000, 0], [1538140200000, 0], [1538140260000, 0], [1538140320000, 0], [1538140380000, 92881926.0], [1538140440000, 92881926.0]]

обновлено

var = [[i[q] for i in l if i[q]] for q in range(len(l[0]))]
l  = [[q if q else var[w][0] for w,q in enumerate(i)] for i in l]

выход

[[1538140080000, 92881926.0], [1538140140000, 92881926.0], [1538140200000, 92881926.0], [1538140260000, 92881926.0], [1538140320000, 92881926.0], [1538140380000, 92881926.0], [1538140440000, 92881926.0]]
0 голосов
/ 28 сентября 2018

Может быть однострочным, если вы жестко заменяете код.

Также, если вы можете разрешить отложенную оценку, вы можете исключить вызов list (...).

replacement = 0
l = list( map(lambda (a,b): [a,replacement if b == None else b], l) )
0 голосов
/ 28 сентября 2018
l = [[1538140080000, None], [1538140140000, None], [1538140200000, None], [1538140260000, None], [1538140320000, None], [1538140380000, 92881926.0], [1538140440000, 92881926.0]]

replacement = next(filter(None, list(zip(*l))[1]))

for sl in l:
     for i, x in enumerate(sl):
         if x is None:
             sl[i] = replacement
print(l)

выходы

[[1538140080000, 92881926.0],
 [1538140140000, 92881926.0],
 [1538140200000, 92881926.0],
 [1538140260000, 92881926.0],
 [1538140320000, 92881926.0],
 [1538140380000, 92881926.0],
 [1538140440000, 92881926.0]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...