Mam kod Pythona, który dzieli się przecinkiem, ale nie usuwa białych znaków:
>>> string = "blah, lots , of , spaces, here "
>>> mylist = string.split(',')
>>> print mylist
['blah', ' lots ', ' of ', ' spaces', ' here ']
Wolę raczej usunąć białe znaki w następujący sposób:
['blah', 'lots', 'of', 'spaces', 'here']
Wiem, że mogłem przeglądać listę i strip () każdego elementu, ale ponieważ jest to Python, domyślam się, że istnieje szybszy, łatwiejszy i bardziej elegancki sposób na zrobienie tego.
python
whitespace
strip
Mr_Chimp
źródło
źródło
Podziel za pomocą wyrażenia regularnego. Uwaga: Sprawę uczyniłem bardziej ogólną z wiodącymi spacjami. Zrozumienie listy polega na usunięciu łańcuchów zerowych z przodu iz tyłu.
Działa to, nawet jeśli
^\s+
nie pasuje:Oto dlaczego potrzebujesz ^ \ s +:
Widzisz wiodące miejsca w bla?
Wyjaśnienie: powyżej używa interpretera języka Python 3, ale wyniki są takie same w języku Python 2.
źródło
[x.strip() for x in my_string.split(',')]
pytanie jest bardziej pytoniczne. Może są przypadki, w których moje rozwiązanie jest konieczne. Zaktualizuję tę zawartość, jeśli napotkam jedną.^\s+
konieczne? Przetestowałem twój kod bez niego i nie działa, ale nie wiem dlaczego.re.compile("^\s*,\s*$")
, wynik będzie[' blah, lots , of , spaces, here ']
.^\s+
robi. Jak widać,^\s*,\s*$
również nie zwraca pożądanych rezultatów. Więc jeśli chcesz podzielić za pomocą wyrażenia regularnego, użyj^\s+|\s*,\s*|\s+$
.Przyszedłem dodać:
map(str.strip, string.split(','))
ale zobaczył, że wspomniał o tym Jason Orendorff w komentarzu .
Czytając komentarz Glenna Maynarda w tej samej odpowiedzi, sugerujący objaśnienia listy na mapie, zacząłem się zastanawiać, dlaczego. Zakładałem, że miał na myśli ze względu na wydajność, ale oczywiście mógł mieć na myśli ze względów stylistycznych lub czegoś innego (Glenn?).
Tak więc szybki (prawdopodobnie wadliwy?) Test na moim urządzeniu przy użyciu trzech metod w pętli ujawnił:
co czyni
map(str.strip, string.split(','))
zwycięzcę, choć wydaje się, że wszyscy są na tym samym boisku.Z pewnością jednak mapa (z lub bez lambda) niekoniecznie musi być wykluczona ze względu na wydajność, a dla mnie jest co najmniej tak klarowna jak lista.
Edytować:
Python 2.6.5 na Ubuntu 10.04
źródło
Po prostu usuń białą spację z łańcucha przed podzieleniem.
źródło
"you just, broke this"
.Wiem, że już na nie odpowiedziano, ale jeśli często to robisz, wyrażenia regularne mogą być lepszym sposobem:
\s
Dopasowuje dowolny znak spacją, a my po prostu zastąpić go z pustym ciągiem''
. Więcej informacji można znaleźć tutaj: http://docs.python.org/library/re.html#re.subźródło
to działa dobrze dla mnie.
źródło
re
(jak w wyrażeniach regularnych) pozwala na dzielenie wielu znaków jednocześnie:Nie działa to dobrze dla przykładowego ciągu, ale działa dobrze w przypadku listy oddzielonej przecinkami. W przykładowym ciągu możesz połączyć moc re.split w celu podzielenia wzorców wyrażeń regularnych, aby uzyskać efekt „podziel na to lub tamto”.
Niestety, to brzydkie, ale
filter
załatwi sprawę:Voila!
źródło
re.split(' *, *', string)
?re.split('[, ]*',string)
dla tego samego efektu.[, ]*
pozostawia pusty ciąg na końcu listy. Myślę, że filtr jest nadal fajną rzeczą do wrzucenia lub trzymania się listy, tak jak robi to najlepsza odpowiedź.map(lambda s: s.strip(), mylist)
byłoby trochę lepsze niż jawne zapętlenie. Lub dla całej rzeczy naraz:map(lambda s:s.strip(), string.split(','))
źródło
map
, gdy korzystaszlambda
z niego , szczególnie jeśli korzystasz z niego, dwukrotnie sprawdź, czy powinieneś używać rozumienia listy.map(str.strip, s.split(','))
.źródło
Po prostu przecinek lub przynajmniej jedna biała spacja z / bez poprzedzających / następnych białych spacji.
Proszę spróbować!
źródło
map(lambda s: s.strip(), mylist)
byłoby trochę lepsze niż jawne zapętlenie.Lub dla całej rzeczy naraz:
To w zasadzie wszystko, czego potrzebujesz.
źródło