जांचें कि क्या सूची के सभी मूल्य एक निश्चित संख्या से अधिक हैं


86
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

एक सामान्य मुद्दों के बारे में पता होना चाहिए: 1) असाइन किया गया booleanचर फ़ंक्शन के लिए स्थानीय है (जैसा कि कोई उपयुक्त globalएनोटेशन नहीं है ), और 2) boolean = 0एक असाइनमेंट है , तुलना नहीं है।
user2864740

ध्यान दें कि आपके my_list1पास एक मूल्य है जो 30 से ऊपर नहीं है। यह 30 के बराबर है। क्या इसके बजाय 31 होना चाहिए, या क्या आप यहां 30 से अधिक या इसके बराबर का परीक्षण कर रहे हैं?
मार्टिन पीटर्स

जवाबों:


147

एक जनरेटर अभिव्यक्ति के साथ 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 नीचे दिए गए मान, तुम वापस False, और बदले Trueअगर आप विपरीत करने के लिए कोई सबूत नहीं मिला।

इसी तरह, आप परीक्षण करने के लिए any()फ़ंक्शन का उपयोग कर सकते हैं यदि कम से कम 1 मूल्य स्थिति से मेल खाता है।


all_30_or_upओवर का उपयोग करने का क्या फायदा है all? allजैसे ही एक नकारात्मक पाया गया है इट्रेटर का सेवन करना भी बंद नहीं करना चाहिए ? काफी गूंगा होगा, अन्यथा नहीं?
हाइपरबोरस

1
@ हाइपरबोरस: जैसे ही एक नकारात्मक पाया गया दोनों रुक जाते हैं। मैं ओपी को समस्या को देखने का एक अलग तरीका देना चाहता था, जो उन्हें लिख रहे थे उन्हें बदलने के लिए एक फ़ंक्शन दे रहा था।
मार्टिन पीटर्स

@MartijnPieters, Mucho <3
zelusp

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
इस समाधान का नुकसान यह है, कि सूची के प्रत्येक आइटम को छूना चाहिए।
हाइपरबोरस

2
मैंने इस पर थोड़ी प्रोफाइलिंग की। allशॉर्टक्रिस्किट्स, तो यह बहुत तेज़ है अगर सूची योग्य नहीं है। लेकिन अगर सूची सभी 30+ है, minतो तेज हो सकती है। मैंने यादृच्छिक पूर्णांकों की दो 1000-तत्व सूचियों के साथ परीक्षण किया, जिनमें से एक भरा random.randint(0, 100)(असफल) और एक भरा random.randint(30, 100)min30-100 की सूची में आधे से कम समय का उपयोग करना । लेकिन 0-100 सूची में शामिल allहोने में लगभग 2% समय लगता है min, इसलिए यह संभवतया तब तक जीतता है जब तक कि असफल सूची बहुत दुर्लभ न हो।
पीटर डेग्लॉपर

1
जैसा कि यह निकला, मेरी 0-100 सूची का पहला तत्व 30 से नीचे था, इसलिए मेरा परीक्षण एक प्रकार का अध: पतन था। सूची के माध्यम से आधा होने के लिए पहले उप -30 तत्व को मजबूर करना, minतेजी से बाहर आता है - 10000 पुनरावृत्तियों के लिए 0.25 के बजाय 0.32 के लिए all। तो जो तेजी से होता है वह डेटा की प्रकृति पर निर्भर करता है, जैसा कि आप उम्मीद करेंगे।
पीटर डेग्लोपर

4

एक अंतर्निहित समारोह है all:

all (x > limit for x in my_list)

मूल्य से अधिक होने के कारण सभी संख्याएँ होनी चाहिए।


के रूप में my_list1परीक्षण करना चाहिए True, परीक्षण लगभग निश्चित रूप से होना चाहिए >= 30, नहीं > 30
मार्टिन पीटर्स

1
ठीक है, जब ओपी का प्रश्न पाठ खुद का विरोध करता है, तो मैं कौन हूं जो सही सीमा है।
हाइपरबोरस

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 धन्यवाद, अब अपडेट किया गया। प्रश्न 30 से ऊपर का उल्लेख है, लेकिन >= 30ऐसा लगता है।
शिमोन विसेर

मुझे पता है, इसीलिए मैंने इसे स्पष्ट किया है। :-)
मार्टिन पीटर्स

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 फ़ंक्शन मान को याद रखता है और समय के साथ गति के लिए परीक्षण करते समय पुन: गणना नहीं करता है)

"सभी" का प्रदर्शन इस बात पर बहुत निर्भर करता है कि पहला तत्व जो मानदंडों को पूरा नहीं करता है, जो पाया गया है, np.sum को थोड़ा सा ऑपरेशन करने की आवश्यकता है, np.min सामान्य मामले में गणना के मामले में सबसे हल्का है। ।

जब मानदंड लगभग तुरंत पूरा हो जाता है और सभी लूप तेजी से बाहर निकल जाते हैं, तो सभी फ़ंक्शन केवल 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)

बहुत उपयोगी हो सकता है एक यह जानना चाहता है कि एक्स के नीचे कितने मूल्य हैं।


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 से अधिक हैं, और जो मान झूठे हैं वे छोटे हैं।


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


मिनट पर खाली सूची () मान बढ़ाएगी। तो मैंने if not xशर्त में जोड़ा ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.