从列表列表中替换列表中的所有元素

时间:2019-09-03 09:23:20

标签: python list numpy

我有一个列表列表,如果其中的1个列表充满了nans,那么其中的一个就是列表。

l_of_l=[[1,2,3],[nan,nan,nan],[3,4,5]]

我想用nans替换l_of_l的列表为零:

所需的输出是

l_of_l=[[1,2,3],[0,0,0],[3,4,5]]

这是我的代码:

     for list1 in l_of_l:
         if all(np.isnan(list1)) == True:
              list1 = [0] * len(list1)

但是我不确定如何将结果再次分配给l_of_l而不需要生成新的列表列表

5 个答案:

答案 0 :(得分:1)

您可以使用以下列表理解:

import numpy as np

[[0 if np.isnan(j) else j for j in i] for i in l_of_l]
# [[1, 2, 3], [0, 0, 0], [3, 4, 5]]

如果您希望避免导入numpy,尽管数据表明您应该使用它,则实际上可以执行以下操作:

[[0 if j!=j else j for j in i] for i in l_of_l]
# [[1, 2, 3], [0, 0, 0], [3, 4, 5]]

根据定义,这NaNs永远不等于自己


或直接构建numpy数组并使用nan_to_num

np.nan_to_num(np.array(l_of_l))

array([[1., 2., 3.],
       [0., 0., 0.],
       [3., 4., 5.]])

答案 1 :(得分:0)

由于您仍在使用numpy,因此可以使用numpy.nan_to_num

import numpy as np
l_of_l= np.array([[1, 2, 3],[np.nan, np.nan, np.nan], [3, 4, 5]])
print(np.nan_to_num(l_of_l))

打印

[[1. 2. 3.]
 [0. 0. 0.]
 [3. 4. 5.]]

答案 2 :(得分:0)

您可以按索引迭代列表的列表,这样就不必生成新列表,只需在索引上对其进行更新:

for i, lst in enumerate(l_of_l):
    if all(np.isnan(lst)) == True:
        l_of_l[i] = [0] * len(lst)

答案 3 :(得分:0)

通过单个np.num_to_nan通话:

import numpy as np

l_of_l = np.array([[1,2,3],[np.nan, np.nan, np.nan],[3,4,5]])
np.nan_to_num(l_of_l, copy=False)
print(l_of_l)

输出:

[1. 2. 3.]
 [0. 0. 0.]
 [3. 4. 5.]]

答案 4 :(得分:0)

您可以尝试以下方法:

import numpy as np

l_of_l=[[1,2,3],[np.NaN,np.NaN,np.NaN],[3,4,5]]
final_l_of_l = []

for listt in l_of_l:
  my_list = []
  my_list = [0 if np.isnan(n) else n for n in listt]
  final_l_of_l.append(my_list)


final_l_of_l

输出:

[[1, 2, 3], [0, 0, 0], [3, 4, 5]]