替换列表中的无值?
Posted
技术标签:
【中文标题】替换列表中的无值?【英文标题】: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
转换为字符串也一样?
您可能想退后一步,首先考虑一下列表是如何构建的。
【参考方案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 的回答在功率和效率方面更适合
【讨论】:
不要使用== None
; None
是一个单例,使用 is None
更快、更 Python 和 PEP-8 兼容。
如果您的意思是这样,请始终使用is None
。 i
可以是实现与None
比较为True
的类型。
@MartijnPieters singleton
是什么意思?
程序生命周期内只有一个副本的对象。 None
、True
、False
、Ellipsis
和 NotImplemented
都是 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)
【讨论】:
以上是关于替换列表中的无值?的主要内容,如果未能解决你的问题,请参考以下文章