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?
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?
Odpowiedzi:
>>> s = "foobar"
>>> list(s)
['f', 'o', 'o', 'b', 'a', 'r']
Potrzebujesz listy
cast_method = lambda x: [x]
Bierzesz ciąg i przekazujesz go do list ()
s = "mystring"
l = list(s)
print l
Możesz to zrobić w bardzo prosty sposób bez list ():
>>> [c for c in "foobar"]
['f', 'o', 'o', 'b', 'a', 'r']
for
, nie ma wiele do wyjaśnienia. Myślę, że powinieneś przeczytać samouczek Pythona na temat struktur danych , zwłaszcza listy.
list(map(lambda c: c, iter("foobar")))
, ale bardziej czytelne i znaczące.
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
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 map
i lambda
funkcja. 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
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.
list
konstruktor 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ż list
bezpośrednie wywoływanie konstruktora.
Radzę przed użyciem map
opartych podejścia, ponieważ map
nie nie zwróci listę w Pythonie 3. Patrz , jak filtrować użytkowania, mapy, i zmniejszyć w Pythonie 3 .
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']
Rozpakuj je:
word = "Paralelepipedo"
print([*word])
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
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']
camelcase = ''.join([text[i].upper() if i % 2 else text[i].lower() for i in range(len(text))])
>>> 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.
for c in a: print c
jest o wiele bardziej bezpośredni