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?


12
Dalam Python, string sudah array karakter untuk semua keperluan kecuali penggantian. Anda dapat mengirisnya, referensi atau mencari item berdasarkan indeks, dll.
dansalmo

Jawaban:


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

Anda perlu daftar


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

60

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

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

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

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


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 .


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("//")

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


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

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

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.


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.


1
for c in a: print cjauh lebih langsung
James Waldby - jwpat7
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.