2016-05-03 17 views

Trả lời

9

Bạn cần phải sử dụng isinstance để lọc ra những nhân tố này là chuỗi. Cũng đừng đặt tên biến của bạn list nó sẽ bóng được xây dựng trong list

>>> from numbers import Real 
>>> lst = ['hello', 1, 2, 3, 4, 'goodbye', 'help'] 
>>> [element for element in lst if isinstance(element, Real)] 
[1, 2, 3, 4] 

hoặc

>>> [element for element in lst if isinstance(element, int)] 
[1, 2, 3, 4] 

hoặc

>>> [element for element in lst if not isinstance(element, str)] 
[1, 2, 3, 4] 
1

Hoặc sử dụng danh sách hiểu như @ user3100115 hoặc sử dụng "lisp/cách tiếp cận lambda "

>> l = [1, 2, 'a', 'b'] 
>> list(filter(lambda a: isinstance(a, int), l)) 
[1, 2] 

Nhân tiện, đừng đặt tên biến là list. Nó đã là một hàm python. :)

+1

Nếu bạn cần 'lambda' để sử dụng' bộ lọc', thì listcomp hoặc genexpr sẽ luôn nhanh hơn và ngắn gọn hơn (giả sử tên viết tắt của biến được lặp lại). Vui lòng không sử dụng 'map' /' filter' nếu bạn cần 'lambda' để làm cho chúng hoạt động. – ShadowRanger

+0

Tôi đã thêm phương pháp "lisp" này cho đầy đủ vì lúc đó chỉ có một câu trả lời về việc hiểu danh sách. Tôi không biết nó chậm hơn. Cảm ơn! –

2

Bạn có thể làm điều đó bằng isinstance, nhưng không giống như những câu trả lời khác bằng user3100115 tôi sẽ loại danh sách đen mà bạn không muốn thay vì danh sách trắng chỉ có một vài loại. Bạn không chắc chắn cái nào phù hợp hơn với trường hợp đặc biệt của bạn, chỉ cần thêm nó vào thay thế. Nó cũng hoạt động mà không cần nhập khẩu.

lst = ['hello', 1, 2, 3, 4, 'goodbye', 'help'] 
filtered = [element for element in lst if not isinstance(element, str)] 
print(filtered) 
# [1, 2, 3, 4] 

Thay vì một sự hiểu biết danh sách, bạn cũng có thể sử dụng filter dựng sẵn. Điều đó trả về một máy phát điện, vì vậy để in trực tiếp nó, bạn phải chuyển đổi nó thành một danh sách đầu tiên. Nhưng nếu bạn sẽ lặp lại nó (ví dụ: sử dụng một for-vòng), không chuyển đổi nó và nó sẽ nhanh hơn và tiêu thụ ít bộ nhớ hơn do "đánh giá lười biếng". Bạn có thể đạt được điều tương tự với ví dụ trên nếu bạn thay thế các dấu ngoặc vuông bằng dấu ngoặc tròn.

lst = ['hello', 1, 2, 3, 4, 'goodbye', 'help'] 
filtered = list(filter(lambda element: not isinstance(element, str), lst)) 
print(filtered) 
# [1, 2, 3, 4] 
Các vấn đề liên quan