I have:
d = [1,'q','3', None, 'temp']
I want to replace None value to 'None' or any string
expected effect:
d = [1,'q','3', 'None', 'temp']
a try replace in string and for loop but I get error:
TypeError: expected a character buffer object
Use a simple list comprehension:
['None' if v is None else v for v in d]
Demo:
>>> d = [1,'q','3', None, 'temp']
>>> ['None' if v is None else v for v in d]
[1, 'q', '3', 'None', 'temp']
Note the is None test to match the None singleton.
d.[v or 'None' for v in d] if you know that you don't have empty strings or anything else that evaluates as False (which may be a risky assumption).Starting Python 3.6 you can do it in shorter form:
d = [f'{e}' for e in d]
hope this helps to someone since, I was having this issue just a while ago.
Using a lengthy and inefficient however beginner friendly for loop it would look like:
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']
Only for beginners, @Martins answer is more suitable in means of power and efficiency
== None; None is a singleton, using is None is faster and more pythonic and PEP-8 compliant.is None if that is what you mean. i can be a type that implements comparison to None as True.singleton ?None, True, False, Ellipsis and NotImplemented are all singletons part of Python itself.List comprehension is the right way to go, but in case, for reasons best known to you, you would rather replace it in-place rather than creating a new list (arguing the fact that python list is mutable), an alternate approach is as follows
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']
I did not notice any answer using lambda..
Someone who wants to use lambda....(Look into comments for explanation.)
#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)
Noneinto a string for whatever you're doing next (that expects a character buffer object), why don't you need to turn the1into a string as well?