2013-10-14 2 views
15

у меня есть:Заменить Нет значения в списке?

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

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

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

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'; «Нет» - одноэлементный, с использованием 'is 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] 

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

Смежные вопросы