2009-08-14 22 views
7

Câu hỏi đơn giản:Có cách nào để xuất các số chỉ từ danh sách python không?

list_1 = [ 'asdada', 1, 123131.131, 'blaa adaraerada', 0.000001, 34.12451235265, 'stackoverflow is awesome' ] 

Tôi muốn tạo ra một list_2 như vậy mà nó chỉ chứa các số:

list_2 = [ 1, 123131.131, 0.000001, 34.12451235265 ] 

Có cách đơn giản để làm điều này, hay tôi phải nghỉ mát để kiểm tra loại biến của từng mục trong danh sách và chỉ xuất ra các mục số?

+3

Tại sao câu hỏi này lại bị bỏ phiếu? –

+0

Darn nó, đây là khi tôi muốn tôi có thể chọn hai câu trả lời – dassouki

+0

và tại sao nó được upvoted cao như vậy bây giờ? nó là một bản sao của nhiều câu hỏi ở đây! – SilentGhost

Trả lời

14

này nên là efficent nhất và ngắn nhất:

import operator 
filter(operator.isNumberType, list_1) 

Edit: này trong python 3000:

import numbers 
[x for x in list_1 if isinstance(x, numbers.Number)] 
+1

sẽ không hoạt động ở py3k – SilentGhost

+0

Tôi không sử dụng py3k, nhưng sau đó nó sẽ chỉ là isinstance (x, numbers.Number) thay vì operator.isNumberType) – dalloliogm

+0

ok .. Tôi không biết nhiều về python 3k, vì vậy tôi đã thay đổi ví dụ một lần nữa. – dalloliogm

0
filter(lambda n: isinstance(n, int), [1,2,"three"]) 
+0

Để kiểm tra các loại khác nhau: bộ lọc (lambda n: isinstance (n, int) hoặc isinstance (n, float), list_of_values) –

+0

i có nghĩa là số nói chung và không chỉ ints – dassouki

12

Đọc danh sách.

list_2 = [num for num in list_1 if isinstance(num, (int,float))] 
+0

hoạt động tốt, cảm ơn: D – dassouki

+0

Có thể có giá trị thêm loại dài vào tuple của bạn. –

+1

Để cải thiện điều này, bạn có thể sử dụng toán tử.isNumberType để xác định xem một phần tử có phải là một số hay không (xem câu trả lời khác của tôi, để làm điều này với bộ lọc thay vì một danh sách hiểu). – dalloliogm

0
list_2 = [i for i in list_1 if isinstance(i, (int, float))] 
+3

'isinstance' chỉ mất 2 đối số. – SilentGhost

+0

Có thể là: list_2 = [i cho i trong danh sách_1 nếu isinstance (i, (int, float))] – hughdbrown

2
list_2 = [i for i in list_1 if isinstance(i, (int, float))] 
-1
>>> [ i for i in list_1 if not str(i).replace(" ","").isalpha() ] 
[1, 123131.13099999999, 9.9999999999999995e-07, 34.124512352650001] 
+0

sẽ ** ** ** chậm – SilentGhost

-1

cho ngắn SilentGhost cách

list_2 = [i for i in list_1 if isinstance(i, (int, float))] 

để

list_2 = [i for i in list_1 if not isinstance(i, str)] 
0

Tôi nghĩ rằng cách dễ nhất là:

[s for s in myList if s.isdigit()] 

Hy vọng nó sẽ giúp!

0

Tất cả các giải pháp được đề xuất chỉ hoạt động nếu các số trong danh sách đã được chuyển đổi thành loại thích hợp (int, float).

Tôi thấy mình có một danh sách đến từ hàm fetchall của sqlite3. Tất cả các phần tử đã được định dạng là str, ngay cả khi một số yếu tố đó thực sự là số nguyên.

cur.execute('SELECT column1 FROM table1 WHERE column2 = ?', (some_condition,)) 
list_of_tuples = cur.fetchall() 

Tương đương từ các câu hỏi sẽ được có cái gì đó như:

list_1 = [ 'asdada', '1', '123131', 'blaa adaraerada', '0', '34', 'stackoverflow is awesome' ] 

Đối với trường hợp này, để có được một danh sách với chỉ số nguyên, đây là giải pháp thay thế tôi thấy:

list_of_numbers = [] 
for tup in list_of_tuples: 
    try: 
     list_of_numbers.append(int(tup[0])) 
    except ValueError: 
     pass 

list_of_numbers sẽ chỉ chứa tất cả các số nguyên từ danh sách ban đầu.

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