목록의 모든 값이 특정 숫자보다 큰지 확인하십시오.


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하나 개 이고 값이 없는 대신 31, 또는 당신보다 더를 판정하는 것을 30해야하는 대신에 동일 30 위를 하거나 동일 여기에 30?
Martijn Pieters

답변:


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()함수 를 사용하여 하나 이상의 값이 조건과 일치 하는지 테스트 할 수 있습니다 .


all_30_or_upover 사용의 장점은 무엇입니까 all? all네거티브가 발견 되 자마자 반복기 사용을 중단 해야하지 않습니까? 그렇지 않으면 꽤 멍청할까요?
Hyperboreus 2013

1
@Hyperboreus : 네거티브가 발견되면 둘 다 중지됩니다. 나는 OP에 문제를 보는 다른 방법을 제공하고 그들이 작성한 것을 대체하는 기능을 제공하고 싶었습니다.
Martijn Pieters

@MartijnPieters, Mucho <3
zelusp 2011

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더 빠를 수 있습니다. 나는 random.randint(0, 100)(실패)로 채워진 두 개의 무작위 정수 목록 과 random.randint(30, 100). min30-100 목록에서 사용하는 데 걸리는 시간은 절반도되지 않았습니다. 그러나 0-100 목록에 all있는 시간의 약 2 %가 걸렸 min으므로 실패한 목록이 매우 드물지 않는 한 아마도 이길 것입니다.
Peter DeGlopper 2013

1
결과적으로 내 0-100 목록의 첫 번째 요소가 30 미만 이었기 때문에 내 테스트는 다소 퇴화되었습니다. 첫 번째 하위 30 요소가 목록의 중간에 오도록 강제하면 min.NET의 경우 0.32 초가 아닌 10000 회 반복의 경우 0.25 초로 조금 더 빠르게 나옵니다 all. 따라서 더 빠른 것은 예상대로 데이터의 특성에 따라 다릅니다.
Peter DeGlopper 2013

4

내장 기능이 있습니다 all.

all (x > limit for x in my_list)

모든 숫자보다 더 큰 값을 제한합니다.


으로 my_list1테스트해야합니다 True, 시험은 거의 확실해야 >= 30하지 > 30.
Martijn Pieters

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

@MartijnPieters 감사합니다, 이제 업데이트되었습니다. 질문에 30 개 이상이 언급되어 있지만 >= 30의도 된 것 같습니다.
Simeon Visser 2013

그게 제가 그것을 명시한 이유입니다. :-)
Martijn Pieters

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

그러나 "all"이 모든 포인트를 통과해야 할 때 확실히 훨씬 더 나 빠지고 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.