список чисел Python, преобразованный в строку неправильно - PullRequest
6 голосов
/ 05 августа 2011

По какой-то причине, когда я делаю код ...

def encode():
    result2 = []
    print result  
    for x in result:  
        result2 += str(x)  
    print result2

Я получаю ...

[123, 456, 789]
['1', '2', '3', '4', '5', '6', '7', '8', '9']

Как мне заставить его вернуть ['123', '456', '789']?

Спасибо!

Ответы [ 4 ]

10 голосов
/ 05 августа 2011

Как насчет:

result2 = [str(x) for x in result]

Причина, по которой вы получаете то, что вы получаете, заключается в том, что += делает объединение списков.Поскольку str(123) равно '123', что можно рассматривать как ['1', '2', '3'], когда вы объединяете это с пустым списком, вы получаете ['1', '2', '3'] (то же самое для других значений)

Чтобы все работало по-своему, вам понадобится:

result2.append(str(x)) # instead of result2 += str(x)
2 голосов
/ 05 августа 2011

Проблема в том, что когда вы используете += в списке, он ожидает, что на другой стороне оператора будет список или какой-то другой тип итераций. Так что вы можете сделать это:

>>> def encode():
...     result2 = []
...     print result 
...     for x in result: 
...         result2 += [str(x)]
...     print result2
... 
>>> result = [123, 456, 789]
>>> encode()
[123, 456, 789]
['123', '456', '789']

Но когда вы сделаете это:

result2 += str(x)

Python предполагает, что вы хотели обработать результат str(x) как итеративный, поэтому перед расширением result2 он эффективно * преобразует строку в список символов, как в следующем примере:

>>> [list(str(x)) for x in result]
[['1', '2', '3'], ['4', '5', '6'], ['7', '8', '9']]

Как и NullUserException , быстрый способ конвертировать элементы в списке - использовать понимание списка. В этом случае просто удалите вызов list выше.


* Точнее, он преобразует результат str(x) в итератор (как при вызове iter() - или, как указал eryksun, при вызове соответствующей функции C API PyObject_GetIter хотя, конечно, это относится только к cpython). Поскольку итерация по строке фактически является итерацией по отдельным символам в строке, каждый символ добавляется в список отдельно.

1 голос
/ 19 марта 2018

Функциональный метод заключается в использовании list(map(str, lst)):

lst = [123, 456, 789]

res = list(map(str,  lst))

print(res)
# ['123', '456', '789']

Производительность немного лучше, чем понимание списка.

0 голосов
/ 05 августа 2011

Использование карты http://docs.python.org/library/functions.html#map

In [2]: input_list = [123, 456, 789]
In [3]: output_list = map(lambda x:str(x), input_list)
In [4]: output_list
Out[5]: ['123', '456', '789']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...