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


85
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

割り当てられた)1:一般的な問題は知っておくべきboolean変数であるローカルそこには適切でないように(関数にglobalアノテーション)、及び2)boolean = 0割り当て、ない比較。
user2864740 2013年

あなたのことに注意してくださいmy_list1持っている1つのである値ではないことではなく、31、またはあなたがより大きいためにテストしていることを30なくてはいけない代わりに等しい30の上をまたはに等しいここ30?
MartijnPieters

回答:


146

ジェネレータ式でall()関数を使用します

>>> 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以下の値は、あなたが返す、とリターンをあなたは逆に証拠を発見した場合。FalseTrue

同様に、このany()関数を使用して、少なくとも1つの値が条件に一致するかどうかをテストできます。


使用することの利点は何であるall_30_or_up以上はallallネガティブが見つかったらすぐにイテレータの消費を停止するべきではありませんか?そうでなければ、かなり馬鹿げているでしょうね。
Hyperboreus 2013年

1
@Hyperboreus:ネガティブが見つかるとすぐに両方とも停止します。私はOPに問題の別の見方を与え、彼らが書いていたものを置き換える機能を与えたかったのです。
MartijnPieters

@ MartijnPieters、Mucho <3
zelusp 2016年

9

...使用できない理由は何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

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


2
このソリューションの欠点は、リストの各項目に触れる必要があることです。
Hyperboreus 2013年

2
これについて少しプロファイリングを行いました。all短絡するので、リストが適格でない場合ははるかに高速です。ただし、リストがすべて30以上の場合minは、より高速になる可能性があります。ランダム整数の2つの1000要素リストでテストしました。1つはrandom.randint(0, 100)(失敗)で埋められ、もう1つはで埋められましたrandom.randint(30, 100)。使用min時間は30-100リストの半分弱でした。しかし、0-100リストで行っallた時間の約2%を要したminので、失敗するリストが非常にまれでない限り、おそらく勝ちます。
Peter DeGlopper 2013年

1
結局のところ、私の0-100リストの最初の要素は30未満だったので、私のテストは一種の退化したものでした。最初のサブ30要素をリストの途中に強制minすると、少し速くなります。10000回の繰り返しでは0.25秒で、は0.32秒ではありませんall。したがって、どちらが速いかは、ご想像のとおり、データの性質によって異なります。
Peter DeGlopper 2013年

4

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

all (x > limit for x in my_list)

すべての数値が必要な値よりも大きい値を制限すること。


my_list1テストする必要がありTrue、テストはほぼ確実であるべき>= 30ではありません> 30
MartijnPieters

1
さて、OPの質問テキストが矛盾する場合、どちらが正しい制限であるかを判断するのは誰ですか。
Hyperboreus 2013年

3

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


my_list1テストする必要がありTrue、テストはほぼ確実であるべき>= 30ではありません> 30
MartijnPieters

@MartijnPietersありがとう、更新されました。質問は30以上に言及していますが、>= 30意図されているようです。
Simeon Visser 2013年

私が知っている、それが私がそれを明示的にした理由です。:-)
MartijnPieters

2

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で速度をテストするときに計算を再度実行しません)

「all」のパフォーマンスは、基準を満たさない最初の要素がいつ見つかるかに大きく依存します。np.sumは少しの操作を行う必要があり、np.minは一般的な場合の計算の点で最も軽いです。 。

基準がほぼ即座に満たされ、allループが高速で終了すると、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より下の値の数を知りたい場合に非常に役立ちます。


0

次のことができます。

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

この関数を書きます

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コンディションで追加しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.