Ответы:
Используйте 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. Поскольку join возвращает строку, ее следует поместить в класс string, а не в класс list, поэтому 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, оператор add принимает ровно 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().