2013-10-14 54 views
15

我:替换列表中的无值?

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

我想无值替换为“无”或任何字符串

预期的效果:

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

一个尝试替换字符串和循环,但我得到错误:

TypeError: expected a character buffer object 
+2

如果你需要把'None'变成一个字符串给你接下来要做的任何事情(那需要一个字符缓冲对象),为什么你不需要把'1'变成一个字符串呢? –

+1

您可能需要退后一步,并考虑首先建立列表的方式。 – chepner

回答

35

使用一个简单的列表理解:

['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

使用冗长而低效但是对于初学者友好的循环就会是什么样子:

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答案更适合在功率和效率的手段

+1

不要使用'== None'; 'None'是一个单身人士,使用'None'更快,更符合Pythonic和PEP-8标准。 –

+0

@MartijnPieters如果你这么说... –

+0

如果这是你的意思,总是使用'is None'。 'i'可以是一个类型,它将'None'与'True'比较。 –

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

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

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

这会将'1'变成'1',OP样本输出只保留该值。 –

+1

这是真的谢谢你!我编辑了答案... –

0

开始的Python 3.6,你可以在更短的形式做到这一点:

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

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