निर्धारित करें कि क्या Integer दो अन्य Integers के बीच है?


397

मैं यह कैसे निर्धारित कर सकता हूं कि दिया गया पूर्णांक दो अन्य पूर्णांक (जैसे / से अधिक / बराबर 10000और उससे कम / बराबर 30000) के बीच है?

मैं 2.3 IDLE का उपयोग कर रहा हूं और मैंने अब तक जो प्रयास किया है वह काम नहीं कर रहा है:

if number >= 10000 and number >= 30000:
    print ("you have to pay 5% taxes")

20
अपने बूलियन ऑपरेटरों की जांच करें, निश्चित रूप से एक संख्या 10000 से अधिक होगी यदि यह 30000 से अधिक है। थोड़ा विवरण देखें और आप कहीं अधिक गलतियां पकड़ लेंगे।
केली

2
तुलना की जा सकती है docs.python.org/2/reference/expressions.html#comparisons
theBuzzyCoder

6
Pls change> = 30000 से <= 30000
Badiboy

जवाबों:


1044
if 10000 <= number <= 30000:
    pass

207
अजगर बहुत अच्छा है :)। और निरर्थक होने के लिए: इसे "अंतराल तुलना" कहा जाता है।
मैट मोंटेग

इस बीच और if number in range(10000, 30001)अन्य समाधानों के अनुसार गति अंतर क्या है ? इसके अतिरिक्त, यह तेजी से या धीमी है जब setइसके बजाय का उपयोग कर range?
सुंग चो

15
@ माइक इंटरवल के साथ numberपहली बार तुलना की जाती है 10000। यदि यह 10000अभिव्यक्ति से कम है , तो तुरंत शॉर्ट-सर्किट कर दिया जाता है और दूसरी तुलना की जाँच नहीं की जाती है। जटिलता है O(1)in range(0, n)इसके बजाय संख्याओं के पूरे अनुक्रम को उत्पन्न करता है और फिर इसके माध्यम से पुनरावृत्त करता है। जटिलता है O(n)। की जटिलता in set(range(0, n))अभी भी है O(n)क्योंकि एक सेट का निर्माण O(n) ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt
Paolo Moretti

5
@ मायके अपने खोल में चलाने की कोशिश करें:> python -m timeit '10000 <= 10 <= 30000' > python -m timeit '10 in range(10000, 30001)' > python -m timeit '10 in set(range(10000, 30001))'
पाओलो मोरेटी

3
python3.5.2 की तरह दिखता है, रेंज ~ 10x धीमी है अगर स्टेटमेंट की तुलना में, गति मान के संबंध में गति स्थिर है ... इस प्रकार फ़ंक्शन ओवरहेड के कारण सबसे अधिक संभावना अंतर है।
अमोह्र

78
>>> r = range(1, 4)
>>> 1 in r
True
>>> 2 in r
True
>>> 3 in r
True
>>> 4 in r
False
>>> 5 in r
False
>>> 0 in r
False

4
वाह मुझे हमेशा लगा range(या xrangepython2 में) एक जनरेटर देता है इस प्रकार आप बार-बार उस पर परीक्षण नहीं कर सकते।
३:१४

24
यह महत्वपूर्ण है तो ध्यान रखें कि 4 in range(1,4)गलत है। तो बेहतर है 1 >= r <= 4क्योंकि यह नए लोगों द्वारा संभावित त्रुटियों से बचा जाता है
ट्रिपल

50
1.5 in rFalse3.4 में भी देता है । यह उत्तर पूर्णांक के लिए ही अच्छा है।
jpmc26

9
@tripplet, आपने ओपी के रूप में एक ही त्रुटि की!, यह होना चाहिए1 <= r <= 4
जॉन ला रोय

8
(1.) खराब प्रदर्शन (जैसा कि अन्य ने बताया है कि यह वाक्यविन्यास अच्छा लग रहा है लेकिन इसे निष्पादित करने में लंबा समय लग सकता है क्योंकि यह ओ (एन) संचालन बनाम if a <= x <= b...) (2.) floatप्रकारों के लिए काम नहीं करता है (3) ।) रेंज परीक्षण समावेशी नहीं है ... इसलिए कई डेवलपर्स बग का परिचय दे सकते हैं क्योंकि वे समावेशी रेंज की उम्मीद करते हैं
ट्रेवर बॉयड स्मिथ

52

आपका ऑपरेटर गलत है। होना चाहिए if number >= 10000 and number <= 30000:। साथ ही, अजगर, बात की इस तरह के लिए एक आशुलिपि है if 10000 <= number <= 30000:


3
... इस तरह की बात को आमतौर पर जंजीर तुलना कहा जाता है ।
वुल्फ

30

आपका कोड स्निपेट,

if number >= 10000 and number >= 30000:
    print ("you have to pay 5% taxes")

वास्तव में जाँच करता है कि संख्या 10000 और 30000 दोनों से बड़ी है या नहीं।

मान लें कि आप जाँचना चाहते हैं कि संख्या 10000 - 30000 की है, तो आप पायथन अंतराल की तुलना का उपयोग कर सकते हैं:

if 10000 <= number <= 30000:
    print ("you have to pay 5% taxes")

इस पायथन सुविधा को आगे पायथन प्रलेखन में वर्णित किया गया है



8

तुलनाओं के साथ परेशानी यह है कि जब आप >=वहाँ डालते हैं, तो डीबग करना मुश्किल हो सकता है<=

#                             v---------- should be <
if number >= 10000 and number >= 30000:
    print ("you have to pay 5% taxes")

पायथन आपको सिर्फ शब्दों में लिखने का मतलब देता है

if number in xrange(10000, 30001): # ok you have to remember 30000 + 1 here :)

Python3 में, आपको rangeइसके बजाय उपयोग करने की आवश्यकता है xrange

संपादित करें: लोगों को माइक्रोबैन्च निशान और कैसे शांत चेनिंग संचालन के साथ अधिक चिंतित होना चाहिए। मेरा उत्तर रक्षात्मक (बग के लिए कम हमले की सतह) प्रोग्रामिंग के बारे में है।

टिप्पणियों में दावे के परिणामस्वरूप, मैंने Python3.5.2 के लिए यहां माइक्रो बेंचमार्क जोड़ा है

$ python3.5 -m timeit "5 in range(10000, 30000)"
1000000 loops, best of 3: 0.266 usec per loop
$ python3.5 -m timeit "10000 <= 5 < 30000"
10000000 loops, best of 3: 0.0327 usec per loop

यदि आप प्रदर्शन के बारे में चिंतित हैं, तो आप एक बार सीमा की गणना कर सकते हैं

$ python3.5 -m timeit -s "R=range(10000, 30000)" "5 in R"
10000000 loops, best of 3: 0.0551 usec per loop

2
दुर्भाग्य से xrange को पायथन 3 में चित्रित किया गया है।
अपराह्न

1
@apraetor, हाँ range(10000, 30001)Python3 में उपयोग करें । यह एक सूची नहीं बनाता है
जॉन ला रोय

3
@JBChouinard, आप बिल्कुल गलत हैं। xrangePython2 में, या rangePython3 में सदस्यता परीक्षण हैं। यदि आप विश्वास नहीं करते हैं तो इसे स्वयं आज़माएँ। <=केवल अधिक कुशल है क्योंकि यह एक श्रेणी वस्तु नहीं बनाता है। O (1) के रूप में दोनों तरीके। मुद्दा यह है कि ओपी इसे अपने तरीके से करने की कोशिश कर रहा था और बग के साथ समाप्त हो गया । फास्ट कोड जो गलत है वह बदतर है।
जॉन ला रोय

2
एक i5 पर, (i) अजगर 3.5:% समय सीमा 5 रेंज में (10000, 30000) 1000 लूप, 3 के सर्वश्रेष्ठ: 451। प्रति लूप। % timeit 10000 <= 5 <= 30000 10000000 लूप्स, सबसे अच्छा 3: 59.4 ns प्रति लूप। इस बात का 7000 से अधिक एक पहलू है
tback

1
@tback, अगर वहाँ एक मौका था यह 7000 गुना धीमा था, तो मैंने इसका सुझाव नहीं दिया होगा। शायद आप फिर से परीक्षण चलाने की कोशिश कर सकते थे।
जॉन ला रूय

8

संख्याओं के बीच सीमा को परिभाषित करें:

r = range(1,10)

फिर इसका उपयोग करें:

if num in r:
    print("All right!")

3
rangeआपके मामले में अंतिम मान 10 नहीं गिना जाता है । range(1,11)सही है, अगर आपको 1 और 10 के बीच तुलना करने की आवश्यकता है
ikbel बेनाबेदसमद

6

कर रहे हैं दो तरीके तीन पूर्णांकों तुलना और जाँच करें कि क्या करने के लिए के बीच है एक और :

if a < b < c:
    pass

तथा

if a < b and b < c:
    pass

पहला वाला अधिक पठनीय दिखता है, लेकिन दूसरा तेजी से चलता है

चलो dis.dis का उपयोग करके तुलना करें :

    >>> dis.dis('a < b and b < c')
  1           0 LOAD_NAME                0 (a)
              2 LOAD_NAME                1 (b)
              4 COMPARE_OP               0 (<)
              6 JUMP_IF_FALSE_OR_POP    14
              8 LOAD_NAME                1 (b)
             10 LOAD_NAME                2 (c)
             12 COMPARE_OP               0 (<)
        >>   14 RETURN_VALUE
>>> dis.dis('a < b < c')
  1           0 LOAD_NAME                0 (a)
              2 LOAD_NAME                1 (b)
              4 DUP_TOP
              6 ROT_THREE
              8 COMPARE_OP               0 (<)
             10 JUMP_IF_FALSE_OR_POP    18
             12 LOAD_NAME                2 (c)
             14 COMPARE_OP               0 (<)
             16 RETURN_VALUE
        >>   18 ROT_TWO
             20 POP_TOP
             22 RETURN_VALUE
>>>

और का उपयोग कर timeit :

~$ python3 -m timeit "1 < 2 and 2 < 3"
10000000 loops, best of 3: 0.0366 usec per loop

~$ python3 -m timeit "1 < 2 < 3"
10000000 loops, best of 3: 0.0396 usec per loop

इसके अलावा, आप रेंज का उपयोग कर सकते हैं , जैसा कि पहले सुझाव दिया गया है, हालांकि यह बहुत अधिक धीमा है।


0

मान लीजिए 3 गैर नकारात्मक पूर्णांक देखते हैं: a, b, और c। गणितीय रूप से, यदि हम यह निर्धारित करना चाहते हैं कि क्या cबीच में है aऔर क्या bसम्मिलित है, तो कोई भी इस सूत्र का उपयोग कर सकता है:

(c - a) * (b - c)> = 0

या अजगर में:

> print((c - a) * (b - c) >= 0)
True

यह गलत है, एक साधारण उदाहरण a = 1, b = 2, c = 3 ba = 1 ca = 2 (ba) * (ca) = 1 * 2> = 0 True => 3 को 1 और 2 के बीच ले लें
रिचर्ड अर्देलीन

मुझसे हुई गलती के लिए क्षमा करें। मैंने अपना उत्तर @RichardArdelean संपादित किया है।
अनास्तासिया-रोमानोवा

0

आप चाहते हैं कि आउटपुट दिए गए स्टेटमेंट को प्रिंट करे और अगर केवल संख्या 10,000 और 30,000 के बीच आती है।

कोड होना चाहिए;

if number >= 10000 and number <= 30000:
    print("you have to pay 5% taxes")

3
यह उत्तर पहले ही सुझाया जा चुका है। आपका उत्तर प्रश्न से क्या जोड़ता है?
जयदीप शेखर

0

शर्त यह होनी चाहिए,

if number == 10000 and number <= 30000:
     print("5% tax payable")

उपयोग करने का कारण number == 10000यह है कि यदि संख्या का मान 50000 है और यदि हम उपयोग number >= 10000करते हैं तो वह शर्त पास हो जाएगी, जो आप नहीं चाहते हैं।


यह 10001 के लिए असफल होगा, उदाहरण के लिए, हालांकि। वह 10000 और 30000 के बीच संख्या चाहता है। आपकी स्थिति केवल संख्या == 10000 के लिए काम करेगी।
गुरेरियो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.