【问题标题】:Replace all elements in a list from list of lists从列表列表中替换列表中的所有元素
【发布时间】:2019-09-03 18:38:36
【问题描述】:

我有一个列表列表,其中 1 个列表如果满是 nan。

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

我想将 l_of_l 的列表替换为 nans 为 0:

想要的输出是

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 而无需生成新的列表列表

【问题讨论】:

    标签: python list numpy


    【解决方案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.]])
    

    【讨论】:

      【解决方案2】:

      您可以按索引迭代列表列表,这样您就不需要生成新列表,只需在索引上更新它:

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

      【讨论】:

        【解决方案3】:

        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】:

          你可以试试这个:

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

          【讨论】:

            【解决方案5】:

            您可以使用numpy.nan_to_num,因为无论如何您都在使用numpy

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

            【讨论】:

              猜你喜欢
              • 2021-01-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-05-28
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多