Відповіді:
Використовуйте joinметод порожнього рядка, щоб з'єднати всі рядки разом із порожнім рядком посеред, як-от так:
>>> a = ['a', 'b', 'c', 'd']
>>> ''.join(a)
'abcd'
' '.join(list)пробіл між цитатами
"".join(['a','b','c'])засоби Join all elements of the array, separated by the string "". Таким же чином " hi ".join(["jim", "bob", "joe"])створимо "jim hi bob hi joe".
Це працює в багатьох популярних мовах, таких як JavaScript і Ruby, чому б не в Python?
>>> ['a', 'b', 'c'].join('')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'join'
Як не дивно, в Python joinметод знаходиться на strкласі:
# this is the Python way
"".join(['a','b','c','d'])
Чому joinне існує такого методу в listоб'єкті, як JavaScript або інші популярні мови скриптів? Це один із прикладів того, як думає спільнота Python. Оскільки приєднання повертає рядок, вона повинна бути розміщена в класі рядків, а не в класі списку, тому str.join(list)метод означає: приєднати список до нової рядки, використовуючи strяк роздільник (у цьому випадку strце порожній рядок).
Я якось полюбив такий спосіб мислення через деякий час. Я можу поскаржитися на багато речей у дизайні Python, але не на його узгодженість.
string.join()з більшістю колекцій, що мають join()метод у багатьох динамічних мовах. Щодо ітерабелів, я думаю, що це не є проблемою для таких мов, оскільки це так само просто (і розбірливо), щоб вкласти ітерабельний в конструктор колекції та ланцюжок у join()методі.
Якщо ваш інтерпретатор Python старий (наприклад, 1.5.2, що є звичайним для деяких старих дистрибутивів Linux), можливо, ви не будете join()доступні як метод для будь-якого старого об'єкта рядка, і вам натомість потрібно буде використовувати модуль рядка. Приклад:
a = ['a', 'b', 'c', 'd']
try:
b = ''.join(a)
except AttributeError:
import string
b = string.join(a, '')
Рядок bбуде 'abcd'.
Це може бути найшвидший спосіб:
>> from array import array
>> a = ['a','b','c','d']
>> array('B', map(ord,a)).tostring()
'abcd'
''.join(['a','b','c'])
map(ord,a)це не потрібно, але потрібно приєднатись map(chr,a). Ось мій орієнтир pastebin.com/1sKFm8ma
''.join()набагато легше читається.
Функція зменшення також працює
import operator
h=['a','b','c','d']
reduce(operator.add, h)
'abcd'
(reduce + '' h)чи (apply + h)працювали б. Але знову ж таки, в Python оператор додавання приймає рівно 2 операнди, отже, потреба у скороченні. В іншому випадку ви можете зробити це operator.add(*h), оскільки applyофіційно застаріли в Python на користь синтаксису розширеного виклику (він же en.wikipedia.org/wiki/Variadic_function )
Якщо список містить номери, ви можете використовувати map()з join().
Наприклад:
>>> arr = [3, 30, 34, 5, 9]
>>> ''.join(map(str, arr))
3303459
''.join([str(i) for i in arr])
h = ['a','b','c','d','e','f']
g = ''
for f in h:
g = g + f
>>> g
'abcdef'
''.join(h)значно перевершить ваш метод додавання один за одним.
окрім того, str.joinщо є найбільш природним способом, є можливість використовувати io.StringIOі зловживати записом writelinesусіх елементів за один раз:
import io
a = ['a','b','c','d']
out = io.StringIO()
out.writelines(a)
print(out.getvalue())
відбитки:
abcd
Використовуючи цей підхід з генераторною функцією або ітерабельним, який не є tupleабо a list, він зберігає створення тимчасового списку, joinякий повинен призначати потрібний розмір за один раз (а список рядків з 1 символом дуже дорогий для пам'яті ).
Якщо у вас мало пам’яті і у вас є як лінійний об'єкт, який оцінюється ліниво, такий підхід є найкращим рішенням.
Ви також можете використовувати operator.concat()так:
>>> from operator import concat
>>> a = ['a', 'b', 'c', 'd']
>>> reduce(concat, a)
'abcd'
Якщо ви використовуєте Python 3, вам потрібно додати:
>>> from functools import reduce
оскільки вбудований файл reduce()був видалений з Python 3 і зараз він живе functools.reduce().