【问题标题】:Replace None value in list?替换列表中的无值?
【发布时间】:2013-10-22 05:36:41
【问题描述】:

我有:

d = [1,'q','3', None, 'temp']

我想将 None 值替换为 'None' 或任何字符串

预期效果:

d = [1,'q','3', 'None', 'temp']

尝试在字符串和 for 循环中替换,但出现错误:

TypeError: expected a character buffer object

【问题讨论】:

  • 如果您需要将None 转换为字符串以执行接下来的操作(需要一个字符缓冲区对象),为什么不需要将1 转换为字符串也一样?
  • 您可能想退后一步,首先考虑一下列表是如何构建的。

标签: python list replace


【解决方案1】:

使用简单的列表推导:

['None' if v is None else v for v in d]

演示:

>>> d = [1,'q','3', None, 'temp']
>>> ['None' if v is None else v for v in d]
[1, 'q', '3', 'None', 'temp']

注意 is None 测试以匹配 None 单例。

【讨论】:

    【解决方案2】:

    您可以简单地使用map 并使用str 函数将所有项目 转换为字符串:

    map(str, d)
    #['1', 'q', '3', 'None', 'temp']
    

    如果你只想转换 None 值,你可以这样做:

    [str(di) if di is None else di for di in d]
    

    【讨论】:

      【解决方案3】:

      使用 冗长且低效但对初学者友好 for 循环看起来像:

      d = [1,'q','3', None, 'temp']
      e = []
      
      for i in d:
          if i is None: #if i == None is also valid but slower and not recommended by PEP8
              e.append("None")
          else:
              e.append(i)
      
      d = e
      print d
      #[1, 'q', '3', 'None', 'temp']
      

      仅限初学者,@Martins 的回答在功率和效率方面更适合

      【讨论】:

      • 不要使用== NoneNone 是一个单例,使用 is None 更快、更 Python 和 PEP-8 兼容。
      • 如果您的意思是这样,请始终使用is Nonei 可以是实现与None 比较为True 的类型。
      • @MartijnPieters singleton 是什么意思?
      • 程序生命周期内只有一个副本的对象。 NoneTrueFalseEllipsisNotImplemented 都是 Python 本身的单例部分。
      【解决方案4】:

      从 Python 3.6 开始,您可以使用更短的形式:

      d = [f'{e}' for e in d]
      

      希望这对某人有所帮助,因为我刚才遇到了这个问题。

      【讨论】:

      • 这里的 f'{e}' 是什么意思?
      • 这是一个“f-string”——文字字符串插值。您可以在PEP 498 中查看更多信息。值得一读,因为它的功能很棒。
      【解决方案5】:

      列表推导是正确的方法,但如果出于您最熟悉的原因,您宁愿将其替换为原地而不是创建一个新列表(认为 python 列表是可变的),另一种选择方法如下

      d = [1,'q','3', None, 'temp', None]
      try:
          while True:
              d[d.index(None)] = 'None'
      except ValueError:
          pass
      
      >>> d
      [1, 'q', '3', 'None', 'temp', 'None']
      

      【讨论】:

        【解决方案6】:

        我没有注意到使用 lambda 的任何答案..

        想使用 lambda 的人....(查看 cmets 以获得解释。)

        #INPUT DATA
        d =[1,'q','3', None, 'temp']
        
        #LAMBDA TO BE APPLIED
        convertItem = lambda i : i or 'None' 
        
        #APPLY LAMBDA
        res = [convertItem(i) for i in d]
        
        #PRINT OUT TO TEST
        print(res)
        

        【讨论】:

          猜你喜欢
          • 2018-05-04
          • 2019-07-28
          • 1970-01-01
          • 1970-01-01
          • 2021-06-29
          • 1970-01-01
          • 2022-11-10
          • 2021-05-24
          • 2011-11-01
          相关资源
          最近更新 更多