2013-04-19 31 views
11

Ví dụ tôi có một câuLàm thế nào để loại bỏ chuỗi rỗng trong một danh sách?

"He is so .... cool!" 

Sau đó, tôi loại bỏ tất cả các dấu chấm câu và làm cho nó trong một danh sách.

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

Làm cách nào để xóa hoặc bỏ qua chuỗi trống?

+0

Chỉ cần nhắc nhở rằng một số từ tiếng Anh [* chứa * dấu chấm câu] (http://oxforddictionaries.com/words/hyphen). Tùy thuộc vào cách bạn dự định sử dụng điều này, bạn có thể cần phải xem xét điều này. –

Trả lời

30

Bạn có thể sử dụng filter, với None như chức năng quan trọng, trong đó lọc ra tất cả các yếu tố đó là False ish (bao gồm cả chuỗi rỗng)

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

Lưu ý tuy nhiên, filter trả về một danh sách trong Python 2, nhưng một máy phát trong Python 3. Bạn sẽ cần phải chuyển đổi nó thành một danh sách trong Python 3, hoặc sử dụng giải pháp đọc danh sách.

False giá trị ish bao gồm:

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

Hãy cẩn thận, vì điều này sẽ trả về một 'danh sách' trong Python 2 và' bộ tạo 'trong Python 3. – Yuushi

+0

@Yuushi cảm ơn, tôi đã thêm vào. – Volatility

+2

điều gì sẽ xảy ra nếu bạn có' [''] '? –

15

Bạn có thể lọc nó như thế này

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

Hoặc bạn có thể sử dụng filter. Trong python 3 filter trả về một trình tạo, do đó list() biến nó thành một danh sách. Đây cũng hoạt động trong python 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

Để tránh gọi 'w.strip (dấu chấm câu)' hai lần, 'l = [w.strip (dấu câu) cho w trong text.split()]' và sau đó '[w cho w trong l nếu w]' wuld được ưa thích hơn ... – glglgl

+0

@glglgl Tôi không sao với việc gọi nó hai lần trong trường hợp này, nhưng có đó cũng là một lựa chọn. Tôi thà sử dụng máy phát điện mặc dù – jamylak

+0

Hmm, bạn nói đúng. Một biểu hiện máy phát điện sẽ được ưa thích thực sự ... – glglgl

0

Bạn có thể lọc ra các chuỗi rỗng rất dễ dàng sử dụng một danh sách hiểu:

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

Bạn có thể sử dụng danh sách hiểu:

cleaned = [x for x in your_list if x] 

Mặc dù tôi sẽ sử dụng regex để trích xuất các từ:

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

Bạn có thể thực hiện việc này với filter.

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

tôi sẽ cung cấp cho bạn câu trả lời cho các câu hỏi mà bạn nên đã hỏi - làm thế nào để tránh những chuỗi rỗng hoàn toàn. Tôi giả sử bạn làm một cái gì đó như thế này để có được danh sách của bạn:

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

Vấn đề là bạn sử dụng .split(" ") chia vào các nhân vật không gian. Tuy nhiên, nếu bạn bỏ qua đối số để split, điều này xảy ra:

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

Quoth các tài liệu:

Nếu tháng chín không được xác định hoặc là Không, một thuật toán tách khác nhau được áp dụng: chạy của liên tiếp khoảng trắng được coi là một dấu tách đơn và kết quả sẽ không chứa các chuỗi trống ở đầu hoặc cuối nếu chuỗi có khoảng trắng đầu hoặc cuối.

Vì vậy, bạn thực sự không cần phải bận tâm với các câu trả lời khác (ngoại trừ Blender's, cách tiếp cận hoàn toàn khác), vì chia nhỏ có thể thực hiện công việc cho bạn!

Các vấn đề liên quan