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]
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 usedIn[40]: a = map(lambda c: c if c.isalpha()else'', s)In[41]: a
Out[41]:['f','o','o','b','a','r','','']
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.
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("//")
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']
Jeśli chcesz czytać tylko dostęp do ciągu, możesz bezpośrednio użyć notacji tablicowej.
Python2.7.6(default,Mar222014,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']
Odpowiedzi:
Potrzebujesz listy
źródło
cast_method = lambda x: [x]
Bierzesz ciąg i przekazujesz go do list ()
źródło
Możesz to zrobić w bardzo prosty sposób bez list ():
źródło
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.
Wynik:
Wynik:
Wynik:
Wynik:
źródło
Zbadałem kolejne dwa sposoby realizacji tego zadania. Może to być pomocne dla kogoś.
Pierwszy jest łatwy:
A drugi użycie
map
ilambda
funkcja. Może być odpowiedni do bardziej złożonych zadań:Na przykład
Zobacz dokumentację Pythona, aby uzyskać więcej metod
źródło
Zadanie sprowadza się do iteracji znaków w łańcuchu i zebrania ich na listę. Tak wyglądałoby najbardziej naiwne rozwiązanie
Oczywiście można go skrócić do sprawiedliwego
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ę.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:
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 .źródło
Potrzebuję tylko szeregu znaków:
Jeśli chcesz podzielić str przez określony str:
źródło
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ć,
źródło
Rozpakuj je:
źródło
Jeśli chcesz czytać tylko dostęp do ciągu, możesz bezpośrednio użyć notacji tablicowej.
Może być przydatny do testowania bez użycia wyrażenia regularnego. Czy ciąg zawiera końcowy znak nowej linii?
źródło
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):
źródło
camelcase = ''.join([text[i].upper() if i % 2 else text[i].lower() for i in range(len(text))])
podobnie jak,
list(string)
ale zwraca generator leniwie oceniany w punkcie użytkowania, dzięki czemu pamięć jest wydajna.źródło
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.
źródło
for c in a: print c
jest o wiele bardziej bezpośredni