Bagaimana cara membagi string menjadi array karakter?

450

Saya sudah mencoba melihat-lihat jawaban di web untuk memisahkan string menjadi array karakter, tetapi sepertinya saya tidak dapat menemukan metode sederhana

str.split(//)sepertinya tidak berfungsi seperti Ruby. Apakah ada cara sederhana untuk melakukan ini tanpa mengulang?

Adrian
sumber
12
Dalam Python, string sudah array karakter untuk semua keperluan kecuali penggantian. Anda dapat mengirisnya, referensi atau mencari item berdasarkan indeks, dll.
dansalmo
4
Tautan ke arah lain
Tobias Kienzler

Jawaban:

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

Anda perlu daftar

pengguna225312
sumber
2
Menurut pendapat saya jauh lebih baik daripada metode ruby, Anda dapat mengkonversi antara jenis urutan secara bebas, bahkan lebih baik, di level C.
arthurprs
list constructor adalah fitur elegan yang secara otomatis mengkonversi string ke array karakter. Sejak, String adalah urutan homogen karakter unicode yang sangat keren untuk bekerja dengan Python dan pencipta Guido telah membuatnya menjadi lebih baik. Mencintai python karena kemampuannya yang luar biasa.
Doogle
Saya ingin bendera di sini untuk tidak melakukan ini ... tetapi jika Anda ingin dipanggil, Anda dapat melarikan diri dari perilaku ini menggunakancast_method = lambda x: [x]
madzohan
72

Anda mengambil string dan meneruskannya ke daftar ()

s = "mystring"
l = list(s)
print l
Senthil Kumaran
sumber
60

Anda juga dapat melakukannya dengan cara yang sangat sederhana tanpa daftar ():

>>> [c for c in "foobar"]
['f', 'o', 'o', 'b', 'a', 'r']
Lewis James-Odwin
sumber
4
Selamat datang di stackoverflow. Maukah Anda memperluas jawaban sedikit untuk menjelaskan bagaimana itu memecahkan masalah.
NJInamdar
21
Ini semata-mata for, tidak banyak yang bisa dijelaskan. Saya pikir Anda harus membaca tutorial python tentang struktur data , terutama pemahaman daftar.
WhyNotHugo
4
Ini hanya berarti list(map(lambda c: c, iter("foobar"))), tetapi lebih mudah dibaca dan bermakna.
no1xsyzy
41

Jika Anda ingin memproses karakter String satu per satu. Anda memiliki berbagai opsi.

uhello = u'Hello\u0020World'

Menggunakan Pemahaman daftar:

print([x for x in uhello])

Keluaran:

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

Menggunakan peta:

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

Keluaran:

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

Memanggil Fungsi daftar yang terpasang:

print(list(uhello))

Keluaran:

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

Menggunakan untuk loop:

for c in uhello:
    print(c)

Keluaran:

H
e
l
l
o

W
o
r
l
d
Sid
sumber
Apakah ada perbedaan karakteristik kinerja masing-masing metode ini?
qxzsilver
20

Saya mengeksplorasi dua cara lain untuk menyelesaikan tugas ini. Mungkin bermanfaat bagi seseorang.

Yang pertama mudah:

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

Dan yang kedua menggunakan mapdan lambdaberfungsi. Mungkin cocok untuk tugas yang lebih kompleks:

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

Sebagai contoh

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

Lihat python docs untuk metode lainnya

Alexey Milogradov
sumber
Cara pertama sangat sederhana. Adakah alasan orang menginginkan sesuatu yang lebih rumit?
undrline
Halo! Opsi pertama memang sederhana. Namun, yang kedua memiliki potensi yang lebih baik untuk menangani pemrosesan yang lebih kompleks.
Alexey Milogradov
19

Tugas bermuara pada iterasi karakter string dan mengumpulkannya ke dalam daftar. Solusi yang paling naif akan terlihat seperti

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

Tentu saja, bisa disingkat menjadi adil

result = [character for character in string]

tetapi masih ada solusi yang lebih pendek yang melakukan hal yang sama.

listkonstruktor dapat digunakan untuk mengonversi setiap iterable (iterator, daftar, tuple, string dll) ke daftar.

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

Nilai tambah besarnya adalah ia berfungsi sama di Python 2 dan Python 3.

Juga, mulai dari Python 3.5 (terima kasih kepada PEP 448 yang mengagumkan ) sekarang mungkin untuk membuat daftar dari setiap iterable dengan mengekstraknya ke daftar kosong literal:

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

Ini lebih rapi, dan dalam beberapa kasus lebih efisien daripada memanggil listkonstruktor secara langsung.

Saya akan menyarankan agar menggunakan mappendekatan berbasis, karena maptidak tidak kembali daftar di Python 3. Lihat Cara penggunaan peta filter, dan mengurangi Python 3 .

kubah
sumber
Saya pikir proposal terakhir sangat bagus. Tapi saya tidak melihat mengapa Anda mengunjungi kembali beberapa pendekatan lain, (kebanyakan dari mereka) telah diposting di sini dan mengalihkan perhatian dari solusi python 3.5 yang luar biasa !
MSeifert
13

Saya hanya perlu array karakter:

arr = list(str)

Jika Anda ingin membagi str dengan str tertentu:

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

split()fungsi inbuilt hanya akan memisahkan nilai berdasarkan kondisi tertentu tetapi dalam satu kata, itu tidak dapat memenuhi kondisi tersebut. Jadi, itu bisa diselesaikan dengan bantuanlist() . Secara internal memanggil Array dan itu akan menyimpan nilai berdasarkan array.

Seharusnya,

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']
Anshul Singh Suryan
sumber
4

Buka kemasannya:

word = "Paralelepipedo"
print([*word])
Enrique Bermúdez
sumber
3

Jika Anda ingin membaca hanya akses ke string, Anda dapat menggunakan notasi array secara langsung.

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'

Dapat bermanfaat untuk pengujian tanpa menggunakan regexp. Apakah string berisi baris akhir yang berakhir?

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

Yah, seperti saya suka versi daftar, ada cara lain yang lebih bertele-tele yang saya temukan (tapi keren jadi saya pikir saya akan menambahkannya ke medan):

>>> 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']
John Lockwood
sumber
camelcase = ''.join([text[i].upper() if i % 2 else text[i].lower() for i in range(len(text))])
whereisalext
1
from itertools import chain

string = 'your string'
chain(string)

mirip dengan list(string)tetapi mengembalikan generator yang malas dievaluasi pada titik penggunaan, sehingga hemat memori.

minggli
sumber
Tidak yakin di mana ini akan lebih berguna daripada string itu sendiri, yang mana yang dapat diubah.
Ry-
0
>>> for i in range(len(a)):
...     print a[i]
... 

di mana a adalah string yang ingin Anda pisahkan. Nilai "a [i]" adalah karakter individual dari string yang dapat ditambahkan ke daftar.

Abass Sesay
sumber
1
for c in a: print cjauh lebih langsung
James Waldby - jwpat7