2009-08-14 16 views
7

proste pytanie:Czy istnieje sposób na wyprowadzanie liczb tylko z listy Pythona?

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

Chcę utworzyć list_2 takie, że zawiera on jedynie numery:

list_2 = [ 1, 123131.131, 0.000001, 34.12451235265 ] 

Czy istnieje uproszczony sposób to zrobić, czy muszę uciekać się do sprawdzania typ zmiennej każdego elementu listy i wyprowadzać tylko te liczbowe?

+3

Dlaczego do cholery to pytanie jest w dalszym ciągu głosowane? –

+0

Cholera, to jest, kiedy chciałbym móc wybrać dwie odpowiedzi: – dassouki

+0

i dlaczego jest teraz wznowiona tak wysoko? to jest duplikat wielu pytań tutaj! – SilentGhost

Odpowiedz

14

Powinno to być najbardziej skuteczny i najkrótszą:

import operator 
filter(operator.isNumberType, list_1) 

Edycja: to w Pythonie 3000:

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

nie będzie działać w py3k – SilentGhost

+0

Nie używam py3k, ale to będzie po prostu isinstance (x, numbers.Number) zamiast operatora.isNumberType) – dalloliogm

+0

ok .. Nie znam zbyt wiele pytonu 3k, więc zmieniłem przykład ponownie. – dalloliogm

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

Aby przetestować dla różnych typów: filtr (lambda n: isinstance (n, int) lub isinstance (n, float), list_of_values) –

+0

mam na myśli numery w ogóle, a nie tylko int – dassouki

12

Uporządkowanie listy.

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

, który działał świetnie, dzięki: D – dassouki

+0

Może Warto dodać typ do swojej krotki. –

+1

Aby to poprawić, możesz użyć operatora.isNumberType, aby określić, czy element jest liczbą (zobacz moją drugą odpowiedź, aby to zrobić z filtrem zamiast ze zrozumieniem listy). – dalloliogm

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

'isinstance' przyjmuje tylko 2 argumenty. – SilentGhost

+0

Prawdopodobnie oznaczono: list_2 = [i dla i na liście_1, jeśli 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

, który byłby ** bardzo ** wolny – SilentGhost

-1

za krótki SilentGhost sposób

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

do

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

Myślę, że najprostszym sposobem jest:

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

Nadzieję, że to pomaga!

0

Wszystkie proponowane rozwiązania działają tylko wtedy, gdy numery na liście są już przekonwertowane na odpowiedni typ (int, float).

Znalazłem się na liście pochodzącej z funkcji fetchall z sqlite3. Wszystkie elementy były sformatowane jako str, nawet jeśli niektóre z tych elementów były w rzeczywistości liczbami całkowitymi.

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

Równowartość od kwestii będzie o coś takiego:

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

W takim przypadku, w celu uzyskania listy tylko z liczb całkowitych, jest to alternatywa znalazłem:

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

lista_numerów będzie zawierała tylko wszystkie liczby całkowite z listy początkowej.

Powiązane problemy