web-dev-qa-db-ja.com

リスト内のすべての値が特定の数値より大きいかどうかを確認します

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

更新2016:

後知恵では、速度が実際に重要な大きなデータセットを処理し、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
57
O.rka

ジェネレータ式で 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値が条件に一致するかどうかをテストできます。

102
Martijn Pieters

... 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

これがまさにあなたが望むものかどうかはわかりませんが、技術的にはこれがあなたが求めたものです...

7
Roberto

組み込み関数allがあります。

all (x > limit for x in my_list)

すべての数字がなければならない値よりも大きい値を制限する。

3
Hyperboreus

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以上のすべての数値が含まれることに注意してください。

2
Simeon Visser

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の下にいくつの値があるかを知りたい場合です。

1
Chachni

次のことができます。

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として返されます。

0
Filip Grebowski

この関数を書く

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を条件に追加しました。

0
Shameem