40

我有:

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

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

预期效果:

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

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

TypeError: expected a character buffer object
4

6 回答 6

74

使用简单的列表推导:

['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单例的测试。

于 2013-10-14T15:36:41.140 回答
13

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

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

如果您只想转换None值,您可以执行以下操作:

[str(di) if di is None else di for di in d]
于 2013-10-14T15:44:53.867 回答
2

使用冗长且低效但对初学者友好的 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 答案在功率和效率方面更适合

于 2013-10-14T15:42:50.340 回答
2

从 Python 3.6 开始,您可以以更短的形式执行此操作:

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

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

于 2017-09-29T12:42:56.537 回答
1

列表理解是正确的方法,但如果出于您最了解的原因,您宁愿就地替换它而不是创建一个新列表(认为 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']
于 2013-10-14T15:43:22.383 回答
0

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

想要使用 lambda 的人......(查看评论以获取解释。)

#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)
于 2020-06-29T03:34:50.300 回答