Bir dizeyi karakter dizisine nasıl bölebilirim?


451

Bir karakter dizisine bir dize bölme cevapları için web etrafına bakmaya çalıştım ama basit bir yöntem bulamıyorum

str.split(//)Ruby gibi çalışıyor gibi görünmüyor. Bunu döngü olmadan yapmanın basit bir yolu var mı?


12
Python'da, dizeler değiştirme dışındaki tüm amaçlar için zaten karakter dizileridir. Onları dilimleyebilir, referans verebilir veya indeks vb.
İle

Yanıtlar:


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

Listeye ihtiyacınız var


2
Benim fikrime göre yakut yönteminden çok daha iyi, sekans türleri arasında C seviyesinde serbestçe, hatta daha iyi dönüştürebilirsiniz.
arthurprs

liste yapıcı, dizeyi otomatik olarak karakter dizisine dönüştüren zarif bir özelliktir. String, unicode karakterlerin homojen bir dizisi olduğundan, Python ve yaratıcısı Guido ile çalışmak çok güzel. Harika yetenekleri için sevgi dolu python.
Doogle

Burada bayrak bunu yapmak istemiyorum ... ama yine de callable istiyorsanız kullanarak bu davranış kaçabilircast_method = lambda x: [x]
madzohan


61

Bunu listeden çok basit bir şekilde de yapabilirsiniz ():

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

4
Stackoverflow'a hoş geldiniz. Sorunu nasıl çözdüğünü açıklamak için cevabı biraz uzatmak ister misiniz?
NJInamdar

21
Bu sadece for, açıklanacak çok şey yok. Veri yapıları , özellikle de liste kavraması üzerine python öğreticisini okumalısınız .
WhyNotHugo

4
Bu sadece anlamına gelir list(map(lambda c: c, iter("foobar"))), ancak daha okunabilir ve anlamlı.
no1xsyzy

42

Dizenizi her seferinde bir karakter işlemek istiyorsanız. çeşitli seçenekleriniz var.

uhello = u'Hello\u0020World'

Liste anlama özelliğini kullanma:

print([x for x in uhello])

Çıktı:

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

Haritayı kullanarak:

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

Çıktı:

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

Dahili liste fonksiyonu çağırma:

print(list(uhello))

Çıktı:

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

Döngü için kullanma:

for c in uhello:
    print(c)

Çıktı:

H
e
l
l
o

W
o
r
l
d

Bu yöntemlerin her birinin performans özelliklerinde farklılıklar var mı?
qxzsilver

20

Bu görevi yerine getirmenin iki yolunu daha araştırdım. Birisi için yararlı olabilir.

İlki kolaydır:

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

Ve ikincisi kullanım mapve lambdaişlev. Daha karmaşık görevler için uygun olabilir:

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

Örneğin

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

Daha fazla yöntem için python belgelerine bakın


İlk yol çok basit. İnsanların daha karmaşık bir şey istemelerinin nedenleri var mı?
undrline

Merhaba! İlk seçenek gerçekten basit. İkincisi, daha karmaşık işleme için daha iyi bir potansiyele sahiptir.
Alexey Milogradov

19

Görev, dizenin karakterleri üzerinde yineleme yapmak ve bunları bir liste halinde toplamak için kaynar. En naif çözüm,

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

Tabii ki, sadece kısaltılabilir

result = [character for character in string]

ama yine de aynı şeyi yapan daha kısa çözümler var.

listyapıcı herhangi bir yinelenebilir dönüştürmek için kullanılabilir (yineleyiciler, listeler, tuples, dize vb.) listeye .

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

Büyük artı, hem Python 2 hem de Python 3'te aynı şekilde çalışmasıdır.

Ayrıca, Python 3.5'ten başlayarak (harika PEP 448 sayesinde ), boş bir liste hazır bilgisine paketini açarak herhangi bir yinelemeden bir liste oluşturmak artık mümkün:

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

Bu daha temiz ve bazı durumlarda aramaktan daha verimli list doğrudan yapıcı .

Ben kullanmanızı tavsiye etmiyoruz map, çünkü merkezli yaklaşımlar mapyok değil Python 3. See bir listesini döndürür kullanım filtresi, haritaya nasıl, ve Python 3'te azaltmak .


Bence son teklif çok güzel. Ama neden diğer yaklaşımlardan bazılarını tekrar gözden geçirdiğinizi anlamıyorum, (çoğu) zaten burada gönderildi ve şaşırtıcı python 3.5 çözümünden dikkatinizi dağıttı !
MSeifert

14

Ben sadece bir dizi karakter gerekir:

arr = list(str)

Str'yi belirli bir str'ye bölmek istiyorsanız:

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

12

split()dahili işlev, değeri yalnızca belirli koşullara göre ayırır, ancak tek kelimeyle koşulu yerine getiremez. Böylece, yardımıyla çözülebilirlist() . Dahili olarak Array öğesini çağırır ve değeri bir dizi temelinde depolar.

, varsayalım

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

Dizeye yalnızca erişimi okumak istiyorsanız, doğrudan dizi gösterimini kullanabilirsiniz.

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'

Normal ifade kullanmadan test için yararlı olabilir. Dize bir bitiş yeni satırı içeriyor mu?

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

1

Peki, liste (ler) sürümünü sevdiğim kadar, işte bulduğum başka bir daha ayrıntılı yol (ama havalı, bu yüzden onu fray'a ekleyeceğimi düşündüm):

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

benzer list(string)ancak kullanım noktasında tembel olarak değerlendirilen bir jeneratörü döndürür, bu nedenle bellek verimlidir.


Bunun dizenin kendisinden daha yararlı olacağından emin değilim, ki bu yinelenebilir.
Ry-

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

burada a, ayırmak istediğiniz dizedir. "A [i]" değerleri, bir listeye eklenebilecek dizenin tek tek karakteridir.


1
for c in a: print cçok daha doğrudan
James Waldby - jwpat7
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.