Перетворити список символів у рядок


Відповіді:


585

Використовуйте joinметод порожнього рядка, щоб з'єднати всі рядки разом із порожнім рядком посеред, як-от так:

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

1
як я можу додати пробіли між символами? у будь-якому випадку це зробити, не повторюючи всю справу?
clifgray

18
просто зробіть ' '.join(list)пробіл між цитатами
clifgray

Приємно з цього приводу те, що ви можете використовувати '\ n'.join (a), якщо хочете написати список в txt, з новими рядками для кожного елемента
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".
Джек

39

Це працює в багатьох популярних мовах, таких як 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. Оскільки приєднання повертає рядок, вона повинна бути розміщена в класі рядків, а не в класі списку, тому str.join(list)метод означає: приєднати список до нової рядки, використовуючи strяк роздільник (у цьому випадку strце порожній рядок).

Я якось полюбив такий спосіб мислення через деякий час. Я можу поскаржитися на багато речей у дизайні Python, але не на його узгодженість.


1
Основна причина того, що приєднання є строковим методом, а не методом списку, полягає в тому, що він приймає будь-який ітерабельний , а не лише список. Можна використовувати генераторні вирази, словники, набори, різні види тощо. Таким чином, це набагато гнучкіше, ніж операція приєднання масиву на більшості мов.
rosuav

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

Так, якщо припустити, що вони або мають ліниві списки (стиль Haskell), або вам зручно поєднувати список перед пам'яттю. Моя думка, що спосіб поведінки Python не є довільним, він має дуже хороше обґрунтування.
rosuav

1
Це не довільно, це дизайнерське рішення уникати забруднення простору імен у кожному класі. :-)
Пауло Скардін

Саме так. Плюс, не все це навіть класи - "ітерабельний" - це протокол, а не клас. Ви можете фільтрувати, картографувати, приєднуватися тощо, використовуючи будь-який ітерабельний файл.
rosuav

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 оператор додавання приймає рівно 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 Ну, Guido вважає за краще цей стиль, але з використанням функції карти абсолютно нічого поганого.
йогобрюс

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

>>> g
'abcdef'

6
Це було б досить повільно. Використання ''.join(h)значно перевершить ваш метод додавання один за одним.
Martijn Pieters

1
у Біблії python (ця сторінка на 1400+), у багатьох місцях це говорить нам про те, що робити це неправильно і його слід уникати, коли це можливо. Це також є болісно очевидною торговою маркою неінформованого початківця пітона (щоб не ображати функціональність ... ну) це може спрацювати, але ви почуєте "Не робіть цього" приблизно від 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.