Преобразовать список символов в строку


Ответы:


586

Используйте joinметод пустой строки, чтобы объединить все строки вместе с пустой строкой между ними, например, так:

>>> a = ['a', 'b', 'c', 'd']
>>> ''.join(a)
'abcd'

1
как я могу добавить пробелы между символами? в любом случае, чтобы сделать это, не повторяя все это?
Клифгрей

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, но не на его согласованность.


1
Основная причина того, что соединение является строковым методом, а не методом списка, состоит в том, что оно принимает любой итеративный , а не только список. Вы можете использовать выражения генератора, словари, наборы, различные виды и т. Д. Так что это гораздо более гибко, чем операция объединения массивов в большинстве языков.
Розав

Я сравнивал Python string.join()с большинством коллекций, имеющих join()метод во многих динамических языках. Что касается итераций, я полагаю, что для таких языков это не проблема, поскольку проще (и разборчиво) заключить итерируемое в конструктор коллекции и цепочку в join()методе.
Пауло Скардин

Да, если предположить, что у них либо есть ленивые списки (в стиле Haskell), либо вы можете спокойно объединить список в память перед началом. Моя точка зрения заключается в том, что Python делает не произвольно, а имеет очень хорошее обоснование.
Росав

1
Это не произвольно, это дизайнерское решение, чтобы избежать загрязнения пространства имен в каждом классе. :-)
Пауло Скардин

Точно. Кроме того, не все из них являются даже классами - «итерируемый» - это протокол, а не класс. Вы можете фильтровать, отображать, объединять и т. Д., Используя любую итерацию.
росав

15

Если ваш интерпретатор 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'.


10

Это может быть самый быстрый способ:

>> from array import array
>> a = ['a','b','c','d']
>> array('B', map(ord,a)).tostring()
'abcd'

4
@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 ..
osirisgothra

4

Функция уменьшения также работает

import operator
h=['a','b','c','d']
reduce(operator.add, h)
'abcd'

1
Меня всегда беспокоит, что операторы сами по себе не являются первоклассными гражданами. В схеме, например, это будет (уменьшить + ч)
Брайан Минтон

По схеме (reduce + '' h)или (apply + h)будет работать. Но опять же, в Python, оператор add принимает ровно 2 операнда, следовательно, необходимо уменьшить. В противном случае вы можете это сделать operator.add(*h), поскольку applyв Python официально объявлен устаревшим в пользу расширенного синтаксиса вызовов (он же en.wikipedia.org/wiki/Variadic_function )
Брайан Минтон,

3

Если список содержит цифры, вы можете использовать map()с join().

Например:

>>> arr = [3, 30, 34, 5, 9]
>>> ''.join(map(str, arr))
3303459

это на самом деле более питонический в использовании''.join([str(i) for i in arr])
user1767754

@ user1767754 Ну, Гвидо предпочитает этот стиль, но нет ничего плохого в использовании функции карты.
Брюс

2
h = ['a','b','c','d','e','f']
g = ''
for f in h:
    g = g + f

>>> g
'abcdef'

6
Это было бы довольно медленно. Использование ''.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-символьных строк очень дорог в памяти ).

Если у вас недостаточно памяти и лениво оцениваемый объект в качестве входных данных, этот подход является лучшим решением.


0

Вы также можете использовать 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().

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.