Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 21, 2020 19:33:04

Qroner
Зарегистрирован: 2020-08-21
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Список в строку

Добрый день.
Подскажите как можно перевести список такого формата -

 [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)
не работает?

Отредактировано Qroner (Авг. 21, 2020 19:35:31)

Офлайн

#2 Авг. 21, 2020 20:26:03

marvellik
Зарегистрирован: 2016-05-15
Сообщения: 639
Репутация: +  73  -
Профиль   Отправить e-mail  

Список в строку

потому что в списке у вас числа а числа ‘склеить’ невозможно

 >>> a = [1,2,3,4,3,2,1]
>>> b = ''.join(map(str,a))
>>> b
'1234321'
>>>

Офлайн

#3 Авг. 23, 2020 12:26:47

Qroner
Зарегистрирован: 2020-08-21
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Список в строку

Ну map по сути то же самое делает что и я в цикле for

Офлайн

#4 Авг. 23, 2020 13:16:19

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Список в строку

Qroner
Почему сразу
b = ''.join(b)
не работает?

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

Если вам хочется больше неявности в языке то выберите другой язык, perl,Javascript и.т.п.
 "".concat(1,2,3)
"123"
Можно выбрать языки в которых пользователь может сам управлять преобразованиями например wolfram Mathematica. В последней трудно вообще написать что-то синтаксически некорректное если правильно соблюдать парность скобок. Другое дело что мнение математики и ваше мнение о смысле написанного могут очень сильно различаться.



Отредактировано doza_and (Авг. 23, 2020 13:29:33)

Офлайн

#5 Авг. 24, 2020 00:17:17

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10022
Репутация: +  857  -
Профиль   Отправить e-mail  

Список в строку

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 будет подвисать.

Так что это разные вещи.



Отредактировано py.user.next (Авг. 24, 2020 00:19:19)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version