Ответы:
Используйте 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()
.