Làm thế nào để chia một chuỗi thành mảng các ký tự?


450

Tôi đã cố gắng tìm kiếm trên mạng để tìm câu trả lời để tách một chuỗi thành một chuỗi các ký tự nhưng dường như tôi không thể tìm thấy một phương thức đơn giản

str.split(//)dường như không hoạt động như Ruby. Có một cách đơn giản để làm điều này mà không cần lặp?


12
Trong Python, các chuỗi đã là các mảng ký tự cho tất cả các mục đích ngoại trừ thay thế. Bạn có thể cắt chúng, tham khảo hoặc tra cứu các mục theo chỉ mục, v.v.
dansalmo

Câu trả lời:


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

Bạn cần danh sách


2
Theo tôi tốt hơn nhiều so với phương pháp ruby, bạn có thể chuyển đổi giữa các loại trình tự một cách tự do, thậm chí tốt hơn, ở cấp độ C.
arthurprs

list constructor là một tính năng thanh lịch tự động chuyển đổi chuỗi thành mảng ký tự. Kể từ đó, String là một chuỗi các ký tự unicode đồng nhất, thật tuyệt khi được làm việc với Python và người tạo Guido đã làm cho nó trở nên tốt hơn. Yêu trăn vì khả năng tuyệt vời của nó.
Doogle

Tôi muốn cờ ở đây không làm điều này ... nhưng dù sao nếu bạn muốn có thể gọi được, bạn có thể thoát khỏi hành vi này bằng cách sử dụngcast_method = lambda x: [x]
madzohan

72

Bạn lấy chuỗi và chuyển nó vào danh sách ()

s = "mystring"
l = list(s)
print l

60

Bạn cũng có thể làm điều đó theo cách rất đơn giản mà không cần list ():

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

4
Chào mừng đến với stackoverflow. Bạn có phiền mở rộng câu trả lời một chút để giải thích cách giải quyết vấn đề không.
NJInamdar

21
Đây chỉ là một for, không có nhiều để giải thích. Tôi nghĩ bạn nên đọc hướng dẫn python về cấu trúc dữ liệu , đặc biệt là hiểu danh sách.
WhyNotHugo

4
Điều này chỉ có nghĩa list(map(lambda c: c, iter("foobar"))), nhưng dễ đọc và có ý nghĩa hơn.
no1xsyzy

41

Nếu bạn muốn xử lý một ký tự Chuỗi của bạn tại một thời điểm. bạn có nhiều lựa chọn khác nhau

uhello = u'Hello\u0020World'

Sử dụng danh sách hiểu:

print([x for x in uhello])

Đầu ra:

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

Sử dụng bản đồ:

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

Đầu ra:

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

Chức năng gọi trong danh sách:

print(list(uhello))

Đầu ra:

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

Sử dụng cho vòng lặp:

for c in uhello:
    print(c)

Đầu ra:

H
e
l
l
o

W
o
r
l
d

Có sự khác biệt về đặc tính hiệu suất của từng phương pháp này không?
qxzsilver

20

Tôi đã khám phá hai cách khác để hoàn thành nhiệm vụ này. Nó có thể hữu ích cho một ai đó.

Điều đầu tiên là dễ dàng:

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

Và thứ hai sử dụng maplambdachức năng. Nó có thể thích hợp cho các nhiệm vụ phức tạp hơn:

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']

Ví dụ

# 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', '', '']

Xem tài liệu python để biết thêm phương pháp


Cách đầu tiên rất đơn giản. Có lý do gì mọi người sẽ muốn một cái gì đó phức tạp hơn?
hạn

Xin chào! Lựa chọn đầu tiên thực sự đơn giản. Tuy nhiên, cái thứ hai có tiềm năng tốt hơn để xử lý việc xử lý phức tạp hơn.
Alexey Milogradov

19

Nhiệm vụ tập trung vào việc lặp lại các ký tự của chuỗi và thu thập chúng vào một danh sách. Giải pháp ngây thơ nhất sẽ như thế nào

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

Tất nhiên, nó có thể được rút ngắn chỉ

result = [character for character in string]

nhưng vẫn có những giải pháp ngắn hơn làm điều tương tự.

listconstructor có thể được sử dụng để chuyển đổi bất kỳ iterable nào (iterators, list, tuples, string, v.v.) sang danh sách.

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

Điểm cộng lớn là nó hoạt động giống nhau trong cả Python 2 và Python 3.

Ngoài ra, bắt đầu từ Python 3.5 (nhờ PEP 448 tuyệt vời ) giờ đây có thể xây dựng một danh sách từ bất kỳ lần lặp nào bằng cách giải nén nó vào một danh sách trống theo nghĩa đen:

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

Điều này gọn gàng hơn và trong một số trường hợp hiệu quả hơn là gọi hàm listtạo trực tiếp.

Tôi muốn khuyên bạn không dùng mapcách tiếp cận dựa trên, bởi vì mapkhông phải trả về một danh sách bằng Python 3. Xem Làm thế nào để bản đồ lọc sử dụng, và giảm trong Python 3 .


Tôi nghĩ rằng đề nghị cuối cùng là rất tốt đẹp. Nhưng tôi không thấy lý do tại sao bạn xem lại một số cách tiếp cận khác, (hầu hết trong số chúng) đã được đăng ở đây và đánh lạc hướng khỏi giải pháp python 3.5 tuyệt vời !
MSeifert

13

Tôi bạn chỉ cần một mảng ký tự:

arr = list(str)

Nếu bạn muốn chia str theo một str cụ thể:

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

12

split()Hàm inbuilt sẽ chỉ phân tách giá trị trên cơ sở điều kiện nhất định nhưng trong một từ duy nhất, nó không thể đáp ứng điều kiện. Vì vậy, nó có thể được giải quyết với sự giúp đỡ của list(). Nó gọi nội bộ Array và nó sẽ lưu trữ giá trị trên cơ sở của một mảng.

Giả sử,

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

Nếu bạn muốn đọc chỉ truy cập vào chuỗi, bạn có thể sử dụng ký hiệu mảng trực tiếp.

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'

Có thể hữu ích để thử nghiệm mà không cần sử dụng regrec. Chuỗi có chứa một dòng mới kết thúc?

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

1

Chà, nhiều như tôi thích phiên bản danh sách, đây là một cách khác dài dòng hơn mà tôi đã tìm thấy (nhưng nó rất tuyệt nên tôi nghĩ tôi sẽ thêm nó vào cuộc cạnh tranh):

>>> 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))])
wherealuext

1
from itertools import chain

string = 'your string'
chain(string)

tương tự list(string)nhưng trả về một trình tạo được đánh giá một cách lười biếng tại điểm sử dụng, do đó bộ nhớ hiệu quả.


Không chắc chắn nơi này sẽ hữu ích hơn chính chuỗi, có thể lặp lại.
Ry-

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

trong đó a là chuỗi mà bạn muốn tách ra. Các giá trị "a [i]" là ký tự riêng của chuỗi có thể được thêm vào danh sách.


1
for c in a: print ctrực tiếp hơn nhiều
James Waldby - jwpat7
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.