как я могу добавить пробелы между символами? в любом случае, чтобы сделать это, не повторяя все это?
Клифгрей
18
просто сделайте ' '.join(list)пробел между кавычками
clifgray
Хорошая вещь в этом заключается в том, что вы можете использовать '\ n'.join (a), если вы хотите записать список в текст с новыми строками для каждого элемента
Norfeldt
28
Чтобы уточнить: "".join(['a','b','c'])значит Join all elements of the array, separated by the string "". Точно так " hi ".join(["jim", "bob", "joe"])же создам "jim hi bob hi joe".
Джек,
40
Это работает во многих популярных языках, таких как 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, но не на его согласованность.
Основная причина того, что соединение является строковым методом, а не методом списка, состоит в том, что оно принимает любой итеративный , а не только список. Вы можете использовать выражения генератора, словари, наборы, различные виды и т. Д. Так что это гораздо более гибко, чем операция объединения массивов в большинстве языков.
Розав
Я сравнивал Python string.join()с большинством коллекций, имеющих join()метод во многих динамических языках. Что касается итераций, я полагаю, что для таких языков это не проблема, поскольку проще (и разборчиво) заключить итерируемое в конструктор коллекции и цепочку в join()методе.
Пауло Скардин
Да, если предположить, что у них либо есть ленивые списки (в стиле Haskell), либо вы можете спокойно объединить список в память перед началом. Моя точка зрения заключается в том, что Python делает не произвольно, а имеет очень хорошее обоснование.
Росав
1
Это не произвольно, это дизайнерское решение, чтобы избежать загрязнения пространства имен в каждом классе. :-)
Пауло Скардин
Точно. Кроме того, не все из них являются даже классами - «итерируемый» - это протокол, а не класс. Вы можете фильтровать, отображать, объединять и т. Д., Используя любую итерацию.
росав
15
Если ваш интерпретатор Python является старым (например, 1.5.2, что часто встречается в некоторых старых дистрибутивах Linux), вы можете не join()использовать его как метод для какого-либо старого строкового объекта, и вам вместо этого потребуется использовать строковый модуль. Пример:
a =['a','b','c','d']try:
b =''.join(a)exceptAttributeError:import string
b = string.join(a,'')
@WinstonEwert Да, вчера я писал программу, которая должна делать такие вещи, и я провел несколько тестов производительности этой линии в моей программе, результат показывает, что она примерно на 20% быстрее, чем''.join(['a','b','c'])
bigeagle
2
Мои собственные бенчмарки показывают в 7 раз быстрее. pastebin.com/8nSc5Ek1 . Вы не против поделиться своим тестом?
Уинстон Эверт
1
@WinstonEwert Вы правы. Я нашел причину этого: в моей программе я извлекаю список int из сети, а затем преобразовываю в строку там, где map(ord,a)это не нужно, но требуется объединение map(chr,a). Вот мой эталон pastebin.com/1sKFm8ma
bigeagle
15
Преждевременная оптимизация. Это так сложно прочитать и понять, что происходит. Если пользователю НЕ НУЖНА производительность в операции, простое ''.join()становится намного более читабельным.
Луис Дамим
5
не согласен - программисты должны помнить самые быстрые методы для таких вещей. одна простая операция, которая занимает немного больше времени, не имеет большого значения. Тем не менее, именно так каждая написанная программа раздувается и занимает слишком много ресурсов. Когда мы не приучаем себя к тому, чтобы делать вещи как можно более компактными, мы в конечном итоге оказываемся в мире, похожем на… ну, например, Windows Vista или Upstart в Linux являются хорошими примерами множества маленьких ярлыков, ведущих к «раздувать и плавать», как в мертвых в воде. они оба безобразны. почему бы не использовать str (). join (a), который на 100% выразителен imfho ..
Меня всегда беспокоит, что операторы сами по себе не являются первоклассными гражданами. В схеме, например, это будет (уменьшить + ч)
Брайан Минтон
По схеме (reduce + '' h)или (apply + h)будет работать. Но опять же, в Python, оператор add принимает ровно 2 операнда, следовательно, необходимо уменьшить. В противном случае вы можете это сделать operator.add(*h), поскольку applyв Python официально объявлен устаревшим в пользу расширенного синтаксиса вызовов (он же en.wikipedia.org/wiki/Variadic_function )
Брайан Минтон,
3
Если список содержит цифры, вы можете использовать map()с join().
Это было бы довольно медленно. Использование ''.join(h)будет намного опережать ваш метод добавления по одному.
Мартин Питерс
1
в «Библии Python» (эта страница 1400+), во многих местах это говорит нам, что это неправильно и следует избегать, когда это возможно. Это также болезненно очевидный товарный знак неосведомленного новичка в Python (не для того, чтобы оскорблять функциональность ... хорошо), он может работать, но вы услышите «Не делай этого» от 5000 человек за это.
osirisgothra
2
кроме того, 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-символьных строк очень дорог в памяти ).
Если у вас недостаточно памяти и лениво оцениваемый объект в качестве входных данных, этот подход является лучшим решением.
Ответы:
Используйте
join
метод пустой строки, чтобы объединить все строки вместе с пустой строкой между ними, например, так:источник
' '.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?
Как ни странно, в Python
join
метод находится вstr
классе:Почему
join
метод вlist
объекте не похож на JavaScript или другие популярные языки сценариев? Это один из примеров того, как думает сообщество Python. Поскольку join возвращает строку, ее следует поместить в класс string, а не в класс list, поэтомуstr.join(list)
метод означает: объединить список в новую строку, используяstr
в качестве разделителя (в данном случаеstr
это пустая строка).Как-то я полюбил этот образ мышления через некоторое время. Я могу жаловаться на многое в дизайне Python, но не на его согласованность.
источник
string.join()
с большинством коллекций, имеющихjoin()
метод во многих динамических языках. Что касается итераций, я полагаю, что для таких языков это не проблема, поскольку проще (и разборчиво) заключить итерируемое в конструктор коллекции и цепочку вjoin()
методе.Если ваш интерпретатор Python является старым (например, 1.5.2, что часто встречается в некоторых старых дистрибутивах Linux), вы можете не
join()
использовать его как метод для какого-либо старого строкового объекта, и вам вместо этого потребуется использовать строковый модуль. Пример:Строка
b
будет'abcd'
.источник
Это может быть самый быстрый способ:
источник
''.join(['a','b','c'])
map(ord,a)
это не нужно, но требуется объединениеmap(chr,a)
. Вот мой эталон pastebin.com/1sKFm8ma''.join()
становится намного более читабельным.Функция уменьшения также работает
источник
(reduce + '' h)
или(apply + h)
будет работать. Но опять же, в Python, оператор add принимает ровно 2 операнда, следовательно, необходимо уменьшить. В противном случае вы можете это сделатьoperator.add(*h)
, посколькуapply
в Python официально объявлен устаревшим в пользу расширенного синтаксиса вызовов (он же en.wikipedia.org/wiki/Variadic_function )Если список содержит цифры, вы можете использовать
map()
сjoin()
.Например:
источник
''.join([str(i) for i in arr])
источник
''.join(h)
будет намного опережать ваш метод добавления по одному.кроме того,
str.join
что является наиболее естественным способом, существует возможность использоватьio.StringIO
и злоупотреблятьwritelines
записью всех элементов за один раз:печатает:
При использовании этого подхода с функцией-генератором или итератором, который не является
tuple
или alist
, он сохраняет создание временного списка,join
который позволяет выделить нужный размер за один раз (а список из 1-символьных строк очень дорог в памяти ).Если у вас недостаточно памяти и лениво оцениваемый объект в качестве входных данных, этот подход является лучшим решением.
источник
Вы также можете использовать
operator.concat()
как это:Если вы используете Python 3, вам нужно добавить:
так как встроенный
reduce()
был удален из Python 3 и теперь живет вfunctools.reduce()
.источник