my_list1 = [30,34,56]
my_list2 = [29,500,43]
リスト内のすべての値が30以上かどうかを確認するにはどうすればよいですか? my_list1
は動作するはずですが、my_list2
は動作しないはずです。
私がすることを考えることができた唯一の事は:
boolean = 0
def func(ls):
for k in ls:
if k >= 30:
boolean = boolean + 1
else:
boolean = 0
if boolean > 0:
print 'Continue'
Elif boolean = 0:
pass
後知恵では、速度が実際に重要な大きなデータセットを処理し、numpy
...を使用した後、これを行います:
>>> my_list1 = [30,34,56]
>>> my_list2 = [29,500,43]
>>> import numpy as np
>>> A_1 = np.array(my_list1)
>>> A_2 = np.array(my_list2)
>>> A_1 >= 30
array([ True, True, True], dtype=bool)
>>> A_2 >= 30
array([False, True, True], dtype=bool)
>>> ((A_1 >= 30).sum() == A_1.size).astype(np.int)
1
>>> ((A_2 >= 30).sum() == A_2.size).astype(np.int)
0
次のようなこともできます:
len([*filter(lambda x: x >= 30, my_list1)]) > 0
ジェネレータ式で all()
function を使用します。
>>> my_list1 = [30, 34, 56]
>>> my_list2 = [29, 500, 43]
>>> all(i >= 30 for i in my_list1)
True
>>> all(i >= 30 for i in my_list2)
False
このテストでは、30以上または等しいがテストされます。そうでない場合、my_list1
もテストに合格しません。
関数でこれを行いたい場合は、次を使用します。
def all_30_or_up(ls):
for i in ls:
if i < 30:
return False
return True
例えば30以下のa値があることを証明する値を見つけたらすぐに、False
を返し、True
を返します。反対の証拠が見つからなかった場合。
同様に、 any()
function を使用して、少なくとも1値が条件に一致するかどうかをテストできます。
... min()
を使用できない理由は何ですか?
def above(my_list, minimum):
if min(my_list) >= minimum:
print "All values are equal or above", minimum
else:
print "Not all values are equal or above", minimum
これがまさにあなたが望むものかどうかはわかりませんが、技術的にはこれがあなたが求めたものです...
組み込み関数all
があります。
all (x > limit for x in my_list)
すべての数字がなければならない値よりも大きい値を制限する。
all()
を使用できます:
my_list1 = [30,34,56]
my_list2 = [29,500,43]
if all(i >= 30 for i in my_list1):
print 'yes'
if all(i >= 30 for i in my_list2):
print 'no'
これには、厳密には30以上ではなく、30以上のすべての数値が含まれることに注意してください。
Np.sum、np.min、およびすべてを使用する間の全体的な勝者は、大きな配列の速度の点でnp.minのようです。
N = 1000000
def func_sum(x):
my_list = np.random.randn(N)
return np.sum(my_list < x )==0
def func_min(x):
my_list = np.random.randn(N)
return np.min(my_list) >= x
def func_all(x):
my_list = np.random.randn(N)
return all(i >= x for i in my_list)
(関数内にnp.array定義を配置する必要があります。そうしないと、np.min関数は値を記憶し、timeitで速度をテストするときに再度計算を行いません)
「すべて」のパフォーマンスは、基準を満たさない最初の要素が見つかったとき、np.sumが少しの操作を行う必要があるとき、np.minが一般的な場合の計算の観点で最も軽いときによって大きく異なります。 。
基準がほぼすぐに満たされ、すべてのループが高速で終了すると、all関数はnp.minをわずかに上回るだけ勝ちです。
>>> %timeit func_sum(10)
10 loops, best of 3: 36.1 ms per loop
>>> %timeit func_min(10)
10 loops, best of 3: 35.1 ms per loop
>>> %timeit func_all(10)
10 loops, best of 3: 35 ms per loop
しかし、「すべて」がすべてのポイントを通過する必要がある場合、それは間違いなくはるかに悪く、np.minが勝ちます:
>>> %timeit func_sum(-10)
10 loops, best of 3: 36.2 ms per loop
>>> %timeit func_min(-10)
10 loops, best of 3: 35.2 ms per loop
>>> %timeit func_all(-10)
10 loops, best of 3: 230 ms per loop
しかし、使用して
np.sum(my_list<x)
非常に便利なのは、xの下にいくつの値があるかを知りたい場合です。
次のことができます。
def Lists():
my_list1 = [30,34,56]
my_list2 = [29,500,43]
for element in my_list1:
print(element >= 30)
for element in my_list2:
print(element >= 30)
Lists()
これにより、30より大きい値はTrueとして、小さい値はfalseとして返されます。
この関数を書く
def larger(x, than=0):
if not x or min(x) > than:
return True
return False
それから
print larger([5, 6, 7], than=5) # False
print larger([6, 7, 8], than=5) # True
print larger([], than=5) # True
print larger([6, 7, 8, None], than=5) # False
min() の空のリストはValueErrorを発生させます。そこで、if not x
を条件に追加しました。