2014-04-07 8 views
5

Mam następujący wykaz,policzyć ile wartości w liście, które spełniają określone warunki

mylist = ['0.976850566018849', 
'1.01711066941038', 
'0.95545901267938', 
'1.13665822176679', 
'1.21770587184811', 
'1.12567451365206', 
'1.18041077035567', 
'1.13799827821001', 
'1.1624485106005', 
'1.37823533969271', 
'1.39598077584722', 
'1.23844320976322', 
'1.57397155911713', 
'1.40605782943842', 
'1.36037525085048', 
'1.185', 
'1.22795283469963', 
'1.17192311574904', 
'1.04121940463022', 
'1.0133517787145', 
'0.986161470813006', 
'1.09820439504488', 
'1.06640283661947', 
'1.05764772395448', 
'1.02678616758973', 
'1.01876057166248', 
'1.09019498604372', 
'1.1665479238629', 
'1.07170094763279', 
'1.1326945725342', 
'1.18199297460235', 
'1.20353001964446', 
'1.00973941850665', 
'1.0662943967844', 
'1.04876624296406', 
'1.12447065457189', 
'0.954629674212134', 
'1.02961694279098'] 

Co chcę zrobić, to policzyć ile wartości w tym wykazie, który jest> = 1,3. Wracając 5, który jest:

 '1.57397155911713' 
     '1.40605782943842' 
     '1.36037525085048' 
     '1.39598077584722' 
     '1.37823533969271' 

Czy istnieje zwarty sposób to zrobić w Pythonie?

+1

Dlaczego musi być zwarty? –

+0

Jaki byłby niedokładny sposób? – devnull

Odpowiedz

6

biorę zwartość, wspomniał Pan w pytaniu, jak krótszy kod. Tak więc, przedstawiam

sum(float(num) >= 1.3 for num in mylist) 

ta wykorzystuje fakt, że w Pythonie True wartości są traktowane jako 1 i False jako 0. Tak więc, gdy float(num) >= 1.3 ocenia się Truthy, będzie 1 a jeśli to się nie powiedzie, rezultat będzie 0. Dodamy wszystkie wartości łącznie, aby uzyskać całkowitą liczbę elementów, które są większe lub równe 1.3.

Można sprawdzić, jak ten

True == 1 
# True 
True + True 
# 2 
False * 10 
# 0 
+0

dziękuję za zrozumienie "zwartości". – pdubois

5

policzyć ile wartości w tym wykazie, który jest> = 1.3:

sum(1 for x in mylist if float(x) >= 1.3) 

Jeśli trzeba faktycznie wyodrębnić listę numerów, które spełniają ten warunek, wystarczy utworzyć tę listę z listą pojmowania i zrobić co chcesz z nim:

a = [x for x in mylist if float(x) >= 1.3] 
print a 
print len(a) 
2

można użyć generator expression

Niektóre proste generatory mogą być kodowane zwięźle jako wyrażenia przy użyciu składni podobnej do listy, ale z nawiasami zamiast nawiasami o numerach . Wyrażenia te są przeznaczone do sytuacji, w których generator jest używany od razu za pomocą funkcji otaczającej. Generator wyrażenia są bardziej kompaktowe, ale mniej uniwersalne niż pełne generatory definicje i wydają się być bardziej przyjazne dla pamięci niż równoważna lista ze zrozumieniem.

coś takiego:

sum(1 for x in mylist if float(x) >= 1.3) 
+0

@ thefourtheye Pozostawienie tego samego _tip_ na każdej odpowiedzi nie wydaje się bardzo konstruktywne. Równie dobrze mógłbyś napisać odpowiedź sam. – devnull

+0

@devnull Przepraszam za to, usunę je. – thefourtheye

0

za pomocą listowych

 
>>> len([i for i in mylist if float(i) >= 1.3]) 
1

Jeśli chcesz wartości zwrócone i przechowywane na liście można zrobić:

count = [] 
for value in mylist: 
    num = float(value) 
    if num >= 1.3: 
     count.append(value) 

Jeśli chcesz wydrukować listę, dodaj:

print(count) 

lub jeśli chcesz zliczania liczby wartości, które są większe add:

print(len(count)) 
0

Można użyć numpy lub pandas, choć do takiego prostego obliczenia byłyby one znacznie wolniej niż alternatyw wymienionych powyżej.

Korzystanie numpy,

import numpy as np 
arr=np.array(mylist).astype(float) 
print len(arr[arr>=1.3]) 

Korzystanie pandas,

import pandas as pd 
s=pd.Series(mylist).astype(float) 
print len(s[s>=1.3]) 

Alternatywnie

(pd.Series(l).astype(float)>=1.3).value_counts()[True] 

na wydajność, najszybszym rozwiązaniem wydaje się być

In [51]: %timeit sum(1 for x in mylist if float(x) >= 1.3) 
100000 loops, best of 3: 8.72 µs per loop 
0

Oto alternatywa, używając reduce() polecenie wbudowane:

reduce(lambda x, y: x + (y >= 1.3), mylist, 0) 

Tylko dla kompletności, gdyż widzę, że to już zaakceptowane odpowiedź. Chodzi o to, że często jest więcej niż jeden sposób, aby coś osiągnąć w Pythonie (lub w wielu innych językach).

Powiązane problemy