Заменить значение None в списке?

У меня есть:

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

Я хочу заменить значение None на "None" или любую строку

ожидаемый эффект:

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

попробуйте заменить строку и цикл, но я получаю ошибку:

TypeError: expected a character buffer object

Ответы

Ответ 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']

Ответ 3

Используя длительный и неэффективный, но начинающий, дружественный для цикла, он будет выглядеть так:

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 более подходит в средствах власти и эффективности

Ответ 4

Понимание списка - это правильный путь, но в случае, если по самым известным вам причинам вы скорее замените его на месте, а не создаете новый список (утверждая, что список 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']

Ответ 5

Запуск Python 3.6 можно сделать в более короткой форме:

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

надеюсь, что это поможет кому-то, потому что у меня была эта проблема совсем недавно.