Відповіді:
Використовуйте 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()
.