2013-04-19 16 views
11

Na przykład mam zdaniaJak usunąć pusty ciąg na liście?

"He is so .... cool!" 

Potem usunąć wszystkie znaki interpunkcyjne i uczynić go na liście.

["He", "is", "so", "", "cool"] 

Jak usunąć lub zignorować pusty ciąg?

+0

Przypomnienie, że niektóre angielskie słowa [* zawierają * interpunkcję] (http://oxforddictionaries.com/words/hyphen). W zależności od tego, w jaki sposób zamierzasz korzystać z tego, możesz wziąć to pod uwagę. –

Odpowiedz

30

Można użyć filter z None jako funkcję klucza, który odfiltrowuje wszystkie elementy, które są False owski (w tym pustych strunach)

>>> lst = ["He", "is", "so", "", "cool"] 
>>> filter(None, lst) 
['He', 'is', 'so', 'cool'] 

Uwaga jednak, że filter zwraca listę w Pythonie 2, ale generator w Pythonie 3. Konwertuj go na listę w Pythonie 3 lub użyj rozwiązania do sprawdzania listy.

False wartości owski obejmują:

False 
None 
0 
'' 
[] 
() 
# and all other empty containers 
+8

Uważaj jednak, ponieważ spowoduje to powrót 'listy' w Pythonie 2 i' generator' w Pythonie 3. – Yuushi

+0

@Uuushi dzięki, dodałem, że w. – Volatility

+2

co się stanie, jeśli masz '['']'? –

15

można filtrować go jak ten

orig = ["He", "is", "so", "", "cool"] 
result = [x for x in orig if x] 

Albo można użyć filter. W python 3 filter zwraca generator, a więc list() zamienia go na listę. Działa to również w Pythonie 2,7

result = list(filter(None, orig)) 
1
>>> from string import punctuation 
>>> text = "He is so .... cool!" 
>>> [w.strip(punctuation) for w in text.split() if w.strip(punctuation)] 
['He', 'is', 'so', 'cool'] 
+0

Aby uniknąć dwukrotnego wywołania 'w.strip (interpunkcja)', 'l = [w.strip (interpunkcja) dla w w text.split()]', a następnie '[w dla w w l, jeśli w]' wuld być preferowany ... – glglgl

+0

@glglgl Nie ma problemu z wywołaniem go dwukrotnie w tym przypadku, ale tak, jest to również opcja. Wolałbym raczej użyć generatora, ale mam rację: – jamylak

+0

Hmm. Wyrażenie generatora byłoby rzeczywiście preferowane ... – glglgl

0

można odfiltrować pustych strun bardzo łatwo za pomocą wyrażeń listowych:

x = ["He", "is", "so", "", "cool"] 
x = [str for str in x if str] 
>>> ['He', 'is', 'so', 'cool'] 
5

Można użyć wyrażeń listowych:

cleaned = [x for x in your_list if x] 

Chociaż chciałbym używać regex wyodrębnić słowa:

>>> import re 
>>> sentence = 'This is some cool sentence with, spaces' 
>>> re.findall(r'(\w+)', sentence) 
['This', 'is', 'some', 'cool', 'sentence', 'with', 'spaces'] 
0

Można to zrobić z filter.

a = ["He", "is", "so", "", "cool"] 
filter(lambda s: len(s) > 0, a) 
3

dam ci odpowiedź na pytania, które powinien zwróciły - Jak uniknąć pusty łańcuch całkowicie. Zakładam, że coś zrobić tak, aby uzyskać listę:

>>> "He is so .... cool!".replace(".", "").split(" ") 
['He', 'is', 'so', '', 'cool!'] 

Chodzi o to, że używasz .split(" ") podzielić na spacjami. Jeśli jednak pominąć argumentu split, to się dzieje:

>>> "He is so .... cool!".replace(".", "").split() 
['He', 'is', 'so', 'cool!'] 

rzekła docs:

Jeśli września nie jest określona lub jest None, inny algorytm łupania jest stosowane: przebiegi rzędu białe znaki są traktowane jako pojedynczy separator, a wynik nie będzie zawierał pustych ciągów na początku lub na końcu, jeśli ciąg znaków będzie poprzedzał lub kończył się białą spacją.

Naprawdę nie musisz przejmować się innymi odpowiedziami (z wyjątkiem Blendera, co jest zupełnie innym podejściem), ponieważ split może wykonać to zadanie za Ciebie!