Найти - Пользователи
Полная версия: Список в строку
Начало » Python для новичков » Список в строку
1
Qroner
Добрый день.
Подскажите как можно перевести список такого формата -
 [1,2,3,4,3,2,1] 
в строку - 1234321
Есть что то проще чем:
 a = [1,2,3,4,3,2,1]
b = []
for i in a:
    b.append(str(i))
b = ''.join(b)
Почему сразу
 b = ''.join(b)
не работает?
marvellik
потому что в списке у вас числа а числа ‘склеить’ невозможно
 >>> a = [1,2,3,4,3,2,1]
>>> b = ''.join(map(str,a))
>>> b
'1234321'
>>>
Qroner
Ну map по сути то же самое делает что и я в цикле for
doza_and
Qroner
Почему сразу
b = ''.join(b)
не работает?

Интересно что вы хотите в ответ услышать? Маловразумительное объяснение что таков дизайн языка?
Неявность преобразований сокращает код, но скрывает потенциальные ошибки. Выбор степени явности это компромисс, и авторы языка выбирают то что считают нужным.
В данном случае есть несколько путей преобразования целого в строку
 "".join([str(1),str(2)])
"".join([hex(1),hex(2)])
Дальше пользуемся дзеном питона - явное лучше неявного.

Если вам хочется больше неявности в языке то выберите другой язык, perl,Javascript и.т.п.
 "".concat(1,2,3)
"123"
Можно выбрать языки в которых пользователь может сам управлять преобразованиями например wolfram Mathematica. В последней трудно вообще написать что-то синтаксически некорректное если правильно соблюдать парность скобок. Другое дело что мнение математики и ваше мнение о смысле написанного могут очень сильно различаться.
py.user.next
Qroner
Ну map по сути то же самое делает что и я в цикле for
В третьем питоне map возвращает итератор
  
>>> m = map(str, [1, 2, 3])
>>> m
<map object at 0x7fbe40fdfe80>
>>> dir(m)
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
>>>
>>> next(m)
'1'
>>> next(m)
'2'
>>> next(m)
'3'
>>> next(m)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>>
То есть как только из итератора можно взять строку, она сразу берётся и передаётся в str.join() и используется там. Потом она сразу выбрасывается из памяти и берётся следующая строка из итератора. То есть память занята только одним элементом всё время, элементы по очереди занимают один и тот же объём оперативной памяти.

А цикл for, который ты делаешь, сначала накапливает весь список этих строк и только в конце передаёт этот весь список в str.join(). То есть память занята всем списком всё время, который постоянно растёт, пока его не использует str.join() и не выкинет из памяти. Если там будет миллион элементов, ты поймёшь разницу. map спокойно отработает миллион элементов, а простой цикл for будет подвисать.

Так что это разные вещи.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB