it-swarm.com.ru

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

Если у меня есть список символов:

a = ['a','b','c','d']

Как мне преобразовать его в одну строку?

a = 'abcd'
368
nos

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

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

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

33
Paulo Scardine

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

15
Kyle

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

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

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

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

используйте join с пустым разделителем

h = ['a','b','c','d','e','f']
print ''.join(h)

или используйте reduce с оператором add

import operator
h=['a','b','c','d']
reduce(operator.add, h)
3
octoback
h = ['a','b','c','d','e','f']
g = ''
for f in h:
    g = g + f

>>> g
'abcdef'
3
Bill

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

Например:

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

>> 3303459
2
yask

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

0
Tonechas

кроме str.join, который является наиболее естественным способом, существует возможность использовать io.StringIO и злоупотреблять writelines для записи всех элементов за один раз:

import io

a = ['a','b','c','d']

out = io.StringIO()
out.writelines(a)
print(out.getvalue())

печатает:

abcd

При использовании этого подхода с функцией-генератором или итератором, который не является Tuple или list, он сохраняет создание временного списка, которое join делает, чтобы выделить правильный размер за один раз (а список из 1-символьных строк очень дорогой память-накрест).

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

0
Jean-François Fabre