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


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.