Jak podzielić ciąg na tablicę znaków?

450

Próbowałem rozejrzeć się w Internecie w poszukiwaniu odpowiedzi na podział łańcucha na tablicę znaków, ale nie mogę znaleźć prostej metody

str.split(//)nie działa tak jak Ruby. Czy istnieje prosty sposób na zrobienie tego bez zapętlania?

Adrian
źródło
12
W Pythonie łańcuchy są już tablicami znaków do wszystkich celów oprócz zamiany. Możesz je pokroić, odwołać lub wyszukać przedmioty według indeksu itp.
dansalmo,
4
Link do innego kierunku
Tobias Kienzler

Odpowiedzi:

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

Potrzebujesz listy

użytkownik225312
źródło
2
Moim zdaniem znacznie lepiej niż metoda ruby, możesz swobodnie konwertować między typami sekwencji, jeszcze lepiej, na poziomie C.
arthurprs
Konstruktor list to elegancka funkcja, która automatycznie konwertuje ciąg znaków na tablicę znaków. Ponieważ String jest jednorodną sekwencją znaków Unicode, fajnie jest pracować z Pythonem, a twórca Guido sprawił, że jest lepszy. Kochający python ze względu na jego wspaniałe możliwości.
Doogle,
Chcę tutaj flagi, aby tego nie robić ... ale w każdym razie, jeśli chcesz wywoływać, możesz uniknąć tego zachowania za pomocącast_method = lambda x: [x]
madzohan
72

Bierzesz ciąg i przekazujesz go do list ()

s = "mystring"
l = list(s)
print l
Senthil Kumaran
źródło
60

Możesz to zrobić w bardzo prosty sposób bez list ():

>>> [c for c in "foobar"]
['f', 'o', 'o', 'b', 'a', 'r']
Lewis James-Odwin
źródło
4
Witamy w Stackoverflow. Czy mógłbyś trochę rozszerzyć odpowiedź, aby wyjaśnić, w jaki sposób rozwiązuje problem?
NJInamdar
21
To jest po prostu for, nie ma wiele do wyjaśnienia. Myślę, że powinieneś przeczytać samouczek Pythona na temat struktur danych , zwłaszcza listy.
WhyNotHugo,
4
To po prostu oznacza list(map(lambda c: c, iter("foobar"))), ale bardziej czytelne i znaczące.
no1xsyzy 12.12.17
41

Jeśli chcesz przetwarzać swój ciąg po jednym znaku na raz. masz różne opcje.

uhello = u'Hello\u0020World'

Korzystanie ze zrozumienia listy:

print([x for x in uhello])

Wynik:

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

Korzystanie z mapy:

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

Wynik:

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

Wywołanie Funkcja wbudowanej listy:

print(list(uhello))

Wynik:

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

Korzystanie z pętli for:

for c in uhello:
    print(c)

Wynik:

H
e
l
l
o

W
o
r
l
d
Sid
źródło
Czy istnieją różnice w charakterystyce wydajności każdej z tych metod?
qxzsilver
20

Zbadałem kolejne dwa sposoby realizacji tego zadania. Może to być pomocne dla kogoś.

Pierwszy jest łatwy:

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

A drugi użycie mapi lambdafunkcja. Może być odpowiedni do bardziej złożonych zadań:

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

Na przykład

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

Zobacz dokumentację Pythona, aby uzyskać więcej metod

Aleksiej Milogradow
źródło
Pierwszy sposób jest bardzo prosty. Czy istnieją powody, dla których ludzie chcieliby czegoś bardziej złożonego?
undrline
Dzień dobry! Pierwsza opcja jest rzeczywiście prosta. Drugi ma jednak lepszy potencjał do obsługi bardziej złożonego przetwarzania.
Aleksiej Milogradow
19

Zadanie sprowadza się do iteracji znaków w łańcuchu i zebrania ich na listę. Tak wyglądałoby najbardziej naiwne rozwiązanie

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

Oczywiście można go skrócić do sprawiedliwego

result = [character for character in string]

ale wciąż istnieją krótsze rozwiązania, które robią to samo.

listkonstruktor może być użyty do konwersji dowolnej iterowalnej (iteratory, listy, krotki, łańcuch itp.) na listę.

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

Dużym plusem jest to, że działa tak samo w Pythonie 2 i Pythonie 3.

Począwszy od Python 3.5 (dzięki niesamowitemu PEP 448 ) można teraz zbudować listę z dowolnej iteracji poprzez rozpakowanie jej na pusty literał listy:

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

Jest to starsze, aw niektórych przypadkach bardziej wydajne niż listbezpośrednie wywoływanie konstruktora.

Radzę przed użyciem mapopartych podejścia, ponieważ mapnie nie zwróci listę w Pythonie 3. Patrz , jak filtrować użytkowania, mapy, i zmniejszyć w Pythonie 3 .

sklepienie
źródło
Myślę, że ostatnia propozycja jest bardzo fajna. Ale nie rozumiem, dlaczego ponownie zapoznałeś się z niektórymi innymi podejściami (większość z nich) już tu opublikowano i odwracasz uwagę od niesamowitego rozwiązania python 3.5!
MSeifert,
14

Potrzebuję tylko szeregu znaków:

arr = list(str)

Jeśli chcesz podzielić str przez określony str:

# str = "temp//temps" will will be ['temp', 'temps']
arr = str.split("//")
Safari
źródło
12

split()wbudowana funkcja rozdzieli wartość tylko na podstawie określonego warunku, ale w jednym słowie nie może spełnić warunku. Można to rozwiązać za pomocąlist() . Wewnętrznie wywołuje tablicę i przechowuje wartość na podstawie tablicy.

Przypuszczać,

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
źródło
4

Rozpakuj je:

word = "Paralelepipedo"
print([*word])
Enrique Bermúdez
źródło
3

Jeśli chcesz czytać tylko dostęp do ciągu, możesz bezpośrednio użyć notacji tablicowej.

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'

Może być przydatny do testowania bez użycia wyrażenia regularnego. Czy ciąg zawiera końcowy znak nowej linii?

>>> t[-1] == '\n'
False
>>> t = 'my string\n'
>>> t[-1] == '\n'
True
Sylvain
źródło
1

Cóż, tak jak lubię wersję list (y), oto kolejny bardziej szczegółowy sposób, w jaki znalazłem (ale jest fajny, więc pomyślałem, że dodam go do walki):

>>> 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
źródło
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)

podobnie jak, list(string)ale zwraca generator leniwie oceniany w punkcie użytkowania, dzięki czemu pamięć jest wydajna.

minggli
źródło
Nie jestem pewien, gdzie byłoby to bardziej przydatne niż sam ciąg, który można iterować.
Ry-
0
>>> for i in range(len(a)):
...     print a[i]
... 

gdzie a to ciąg, który chcesz oddzielić. Wartości „a [i]” to indywidualny znak ciągu, który można dołączyć do listy.

Abass Sesay
źródło
1
for c in a: print cjest o wiele bardziej bezpośredni
James Waldby - jwpat7