Як розділити рядок на масив символів?


450

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

str.split(//)схоже, не працює, як це робить Рубі. Чи є простий спосіб зробити це без циклу?


12
У Python рядки - це вже масиви символів для всіх цілей, крім заміни. Ви можете їх нарізати, посилати або шукати елементи за індексом тощо.
— dansalmo

Відповіді:


860
>>> s = "foobar"
>>> list(s)
['f', 'o', 'o', 'b', 'a', 'r']

Вам потрібен список


2
На мою думку, набагато краще, ніж метод рубіну, ви можете конвертувати між типами послідовностей вільно, навіть краще, на рівні C.
— arthurprs

конструктор списку - це елегантна функція, яка автоматично перетворює рядок у масив символів. Оскільки String - це однорідна послідовність символів unicode, її настільки круто, що працювати з Python, і творець Guido зробив це на краще. Люблячий пітон за свої чудові можливості.
— Doogle

Я хочу, щоб прапор тут не робив цього ... але в будь-якому випадку, якщо ви хочете зателефонувати, ви можете уникнути такої поведінки, використовуючиcast_method = lambda x: [x]
— madzohan


60

Ви також можете зробити це дуже простим способом без списку ():

>>> [c for c in "foobar"]
['f', 'o', 'o', 'b', 'a', 'r']

4
Ласкаво просимо в stackoverflow. Не хотіли б трохи розширити відповідь, щоб пояснити, як вона вирішує проблему.
— NJInamdar

21
Це просто for, пояснювати не так вже й багато. Я думаю, вам слід прочитати підручник з пітона про структури даних , особливо для розуміння списку.
— WhyNotHugo

4
Це просто означає list(map(lambda c: c, iter("foobar"))), але більш читабельно та змістовно.
— no1xsyzy

41

Якщо ви хочете обробити свій рядок по одному символу за раз. у вас є різні варіанти.

uhello = u'Hello\u0020World'

Використання розуміння списку:

print([x for x in uhello])

Вихід:

['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']

Використання карти:

print(list(map(lambda c2: c2, uhello)))

Вихід:

['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']

Виклик функції вбудованого списку:

print(list(uhello))

Вихід:

['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']

Використання для циклу:

for c in uhello:
    print(c)

Вихід:

H
e
l
l
o

W
o
r
l
d

Чи є відмінності в експлуатаційних характеристиках кожного з цих методів?
— qxzsilver

20

Я дослідив ще два способи виконання цього завдання. Це може бути корисно для когось.

Перший легко:

In [25]: a = []
In [26]: s = 'foobar'
In [27]: a += s
In [28]: a
Out[28]: ['f', 'o', 'o', 'b', 'a', 'r']

А другий - використання mapта lambdaфункціонування. Це може бути доречним для складніших завдань:

In [36]: s = 'foobar12'
In [37]: a = map(lambda c: c, s)
In [38]: a
Out[38]: ['f', 'o', 'o', 'b', 'a', 'r', '1', '2']

Наприклад

# isdigit, isspace or another facilities such as regexp may be used
In [40]: a = map(lambda c: c if c.isalpha() else '', s)
In [41]: a
Out[41]: ['f', 'o', 'o', 'b', 'a', 'r', '', '']

Див пітона документацію для більш методів


Перший спосіб дуже простий. Чи є причини, що люди хочуть чогось більш складного?
— unrline

Привіт! Перший варіант справді простий. Другий, однак, має кращий потенціал для управління більш складною обробкою.
— Олексій Мілоградов

19

Завдання зводиться до ітерації над символами рядка та збирання їх у список. Найбільш наївне рішення виглядало б

result = []
for character in string:
    result.append(character)

Звичайно, його можна скоротити до просто

result = [character for character in string]

але все ж є більш короткі рішення, які роблять те саме.

listконструктор може бути використаний для перетворення будь-якого ітерабельного (ітераторів, списків, кортежів, рядків тощо) до списку.

>>> list('abc')
['a', 'b', 'c']

Великий плюс у тому, що він працює однаково і в Python 2, і в Python 3.

Також, починаючи з Python 3.5 (завдяки дивовижному PEP 448 ), тепер можна створити список з будь-якого ітерабельного, розпакувавши його у порожній літеральний список:

>>> [*'abc']
['a', 'b', 'c']

Це акуратніше, а в деяких випадках і ефективніше, ніж викликати listконструктор безпосередньо.

Я б радив не використовувати mapпідходи, засновані на основі, тому mapщо не повертає список у Python 3. Див. Як користуватися фільтром, картою та зменшенням у Python 3 .


Я думаю, що остання пропозиція дуже приємна. Але я не бачу, чому ви переглянули деякі інші підходи, (більшість з них) вже розміщені тут і відволікають від дивовижного рішення python 3.5!
— MSeifert

14

Мені просто потрібен масив символів:

arr = list(str)

Якщо ви хочете розділити str на конкретну str:

# str = "temp//temps" will will be ['temp', 'temps']
arr = str.split("//")

12

split()вбудована функція буде відокремлювати лише значення на основі певної умови, але одним словом воно не може виконати умову. Отже, це можна вирішити за допомогою list(). Він внутрішньо викликає масив, і він буде зберігати значення на основі масиву.

Припустимо,

a = "bottle"
a.split() // will only return the word but not split the every single char.

a = "bottle"
list(a) // will separate ['b','o','t','t','l','e']


3

Якщо ви бажаєте читати лише доступ до рядка, ви можете використовувати позначення масиву безпосередньо.

Python 2.7.6 (default, Mar 22 2014, 22:59:38) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> t = 'my string'
>>> t[1]
'y'

Може бути корисним для тестування без використання regexp. Чи містить рядок закінчення нового рядка?

>>> t[-1] == '\n'
False
>>> t = 'my string\n'
>>> t[-1] == '\n'
True

1

Ну, як мені подобається версія списку (ів), ось ще один багатослівний спосіб, який я знайшов (але це круто, тому я подумав би додати його до перемоги):

>>> text = "My hovercraft is full of eels"
>>> [text[i] for i in range(len(text))]
['M', 'y', ' ', 'h', 'o', 'v', 'e', 'r', 'c', 'r', 'a', 'f', 't', ' ', 'i', 's', ' ', 'f', 'u', 'l', 'l', ' ', 'o', 'f', ' ', 'e', 'e', 'l', 's']

camelcase = ''.join([text[i].upper() if i % 2 else text[i].lower() for i in range(len(text))])
— наступний

1
from itertools import chain

string = 'your string'
chain(string)

подібний до, list(string)але повертає генератор, який ліниво оцінюється в точці використання, тому пам'ять ефективно.


Не впевнений, де це було б корисніше, ніж сам рядок, який можна виправити.
— Ри-

0
>>> for i in range(len(a)):
...     print a[i]
... 

де a - рядок, яку ви хочете відокремити. Значення "a [i]" є індивідуальним символом рядка, який можна було б додати до списку.


1
for c in a: print cнабагато більш прямий
— Джеймс Waldby - jwpat7
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.