यदि सूची इंडेक्स मौजूद है, तो X करें


129

मेरे कार्यक्रम में, उपयोगकर्ता इनपुट नंबर n, और फिर इनपुट nस्ट्रिंग्स की संख्या, जो एक सूची में संग्रहीत होती है।

मुझे इस तरह के कोड की आवश्यकता है कि यदि एक निश्चित सूची सूचकांक मौजूद है, तो एक फ़ंक्शन चलाएं।

इस तथ्य से और अधिक जटिल बना दिया जाता है कि मैंने बयान दिया है कि क्या हुआ है len(my_list)

यहाँ मेरे पास अब जो कुछ भी काम नहीं कर रहा है उसका एक सरलीकृत संस्करण है:

n = input ("Define number of actors: ")

count = 0

nams = []

while count < n:
    count = count + 1
    print "Define name for actor ", count, ":"
    name = raw_input ()
    nams.append(name)

if nams[2]: #I am trying to say 'if nams[2] exists, do something depending on len(nams)
    if len(nams) > 3:
        do_something
    if len(nams) > 4
        do_something_else

if nams[3]: #etc.

1
लगता है कि आप nएक पूर्णांक के रूप में कास्ट लिखना चाहते हैं , सूची नहीं। मैं उलझन में हूं।
mVChr

2
हाँ, वास्तविक समस्या यहाँ उपयोग कर रहा है nके बजाय namsमें ifरों
Wooble

आपके मामले में n एक सूची नहीं है। पहले इसे पूर्णांक होने के लिए जांचें (कास्ट) करें, फिर आप उस प्रभाव के आधार पर पुनरावृत्ति या गणना कर सकते हैं जिसे आप प्राप्त करना चाहते हैं।
इस्तेमाल आम

हां, गलत किया गया। नाम के लिए तय []
user1569317

"तथ्य यह है कि मेरे पास उप है अगर लेन (my_list) के बारे में बयान।" क्या आपने सोचा है कि किन सूचियों के बारे में क्या संकेत मिलता है, इस तथ्य से कि lenसूची का मूल्य कम से कम एक निश्चित मूल्य है?
कार्ल केनचेल

जवाबों:


157

क्या आपके लिए यह संभव हो सकता len(n)है कि n[i]प्रत्येक संभावित लंबाई की जाँच करने के बजाय अपने निर्णय को सूचित करने के लिए सूची की लंबाई का उपयोग करें ?


6
हां। कोड की समीक्षा करने पर, मेरा सेट-अप पूरी तरह से शानदार था; len (n) मेरी जरूरत की हर चीज को पूरा किया। सही दिशा में एक बिंदु के लिए धन्यवाद।
user1569317

1
यह नकारात्मक अनुक्रमित के लिए जिम्मेदार नहीं है। सबसे अच्छा तरीका मुझे पता है कि कोशिश कर रहा हूँ / IndexError को छोड़कर, लेकिन एक बूल पाने के लिए संक्षिप्त तरीका रखना अच्छा होगा
अब्राम

पायथन में सूचियों पर नकारात्मक सूचकांक सूची के अंत से पीछे की ओर गिनते हैं। इसलिए वे एक तरह से मौजूद नहीं हो सकते थे जो सूची की लंबाई को प्रभावित करते हैं।
जोनाथन

84

मुझे इस तरह के कोड की आवश्यकता है कि यदि एक निश्चित सूची सूचकांक मौजूद है, तो एक फ़ंक्शन चलाएं।

यह एक कोशिश ब्लॉक के लिए सही उपयोग है :

ar=[1,2,3]

try:
    t=ar[5]
except IndexError:
    print('sorry, no 5')   

# Note: this only is a valid test in this context 
# with absolute (ie, positive) index
# a relative index is only showing you that a value can be returned
# from that relative index from the end of the list...

हालाँकि, परिभाषा के अनुसार, पायथन सूची में सभी आइटम मौजूद हैं 0और len(the_list)-1मौजूद हैं (अर्थात, यदि आप जानते हैं, तो कोशिश करने की कोई आवश्यकता नहीं है,0 <= index < len(the_list) )।

यदि आप 0 और अंतिम तत्व के बीच अनुक्रमणिका चाहते हैं, तो आप गणना कर सकते हैं :

names=['barney','fred','dino']

for i, name in enumerate(names):
    print(i + ' ' + name)
    if i in (3,4):
        # do your thing with the index 'i' or value 'name' for each item...

यदि आप कुछ परिभाषित 'सूचकांक' के बारे में सोच रहे हैं, तो मुझे लगता है कि आप गलत सवाल पूछ रहे हैं। शायद आपको एक मानचित्रण कंटेनर (जैसे एक तानाशाह) बनाम एक अनुक्रम कंटेनर (जैसे कि एक सूची) का उपयोग करने पर विचार करना चाहिए । आप अपने कोड को इस तरह दोबारा लिख ​​सकते हैं:

def do_something(name):
    print('some thing 1 done with ' + name)

def do_something_else(name):
    print('something 2 done with ' + name)        

def default(name):
    print('nothing done with ' + name)     

something_to_do={  
    3: do_something,        
    4: do_something_else
    }        

n = input ("Define number of actors: ")
count = 0
names = []

for count in range(n):
    print("Define name for actor {}:".format(count+1))
    name = raw_input ()
    names.append(name)

for name in names:
    try:
        something_to_do[len(name)](name)
    except KeyError:
        default(name)

इस तरह चलता है:

Define number of actors: 3
Define name for actor 1: bob
Define name for actor 2: tony
Define name for actor 3: alice
some thing 1 done with bob
something 2 done with tony
nothing done with alice

आप एक छोटे संस्करण के लिए प्रयास करने के अलावा / .get विधि का भी उपयोग कर सकते हैं :

>>> something_to_do.get(3, default)('bob')
some thing 1 done with bob
>>> something_to_do.get(22, default)('alice')
nothing done with alice

3
ब्लॉक करने का प्रयास करें मैं पायथन में एक शुरुआत हूं, लेकिन ऐसा लगता है कि प्रोग्रामिंग में कोई बड़ा नहीं है ... प्रवाह नियंत्रण के लिए अपवाद? अपवाद उन चीजों के लिए होना चाहिए जिन्हें हम सही से नियंत्रित नहीं कर सकते हैं?
लुइस

3
@ उपर मैं अजगर के रूप में भी शुरुआत कर रहा हूं, लेकिन इन उदाहरणों में मैंने जो अपवाद पढ़ा है, वह है शैली पायथन ने कहा कि C / Java / C # नहीं। देखें stackoverflow.com/questions/11360858/…
टिनिस्टर

वाक्य '0 और लेन (सूची)' के बीच एक पायथन सूची में सभी सूचकांक बिल्कुल गलत हैं। मान लीजिए कि एक सूची है x = [1, 2, 3] जो len_x = 3. ऐसा कोई सूचकांक नहीं है। 3. वाक्य यह होना चाहिए था: '0 और len (सूची) - 1' के बीच पायथन सूची में सभी सूचकांक ।
लाइर मैगन

9
@ LiorMagen: आप सही हैं और मैंने इसे संपादित किया है। इस तरह के एक पांडित्यपूर्ण त्रुटि के लिए वोट करने के लिए थोड़े कठोर मत है। एक साधारण टिप्पणी पर्याप्त होगी।
dawg

मैं बताता हूं कि अंदर चिपकी हुई चीजें आपको tryयह नहीं बताती हैं कि क्या सूचकांक केवल मौजूद है अगर यह उपलब्ध है - ले -1- वह सूचकांक वास्तव में मौजूद नहीं है, लेकिन एक मूल्य वापस आ जाएगा।
जॉर्ज माउर

17

len(nams)nआपके कोड में समान होना चाहिए । सभी सूचकांक 0 <= i < n"मौजूद" हैं।


15

यह केवल निम्नलिखित कोड का उपयोग करके किया जा सकता है:

if index < len(my_list):
    print(index, 'exists in the list')
else:
    print(index, "doesn't exist in the list")

6

मुझे इस तरह के कोड की आवश्यकता है कि यदि एक निश्चित सूची सूचकांक मौजूद है, तो एक फ़ंक्शन चलाएं।

आप पहले से ही जानते हैं कि इसके लिए परीक्षण कैसे करना है और वास्तव में आपके कोड में पहले से ही ऐसे परीक्षण कर रहे हैं

लंबाई की सूची के लिए वैध सूचकांक के माध्यम से nकर रहे हैं0n-1 समावेशी।

इस प्रकार, एक सूची में एक सूचकांक होता है i यदि और केवल यदि सूची की लंबाई कम से कम हो i + 1


हां, मेरे पास अपनी समस्या को हल करने के लिए उपकरण थे, बस उन्हें स्पष्ट रूप से लागू नहीं किया गया था। सही दिशा में एक बिंदु के लिए धन्यवाद।
user1569317

इसके लिए धन्यवाद, विशेष रूप से अंतिम वाक्य, जो पायथन सूचियों की एक महत्वपूर्ण संपत्ति है जो उन्हें जावास्क्रिप्ट सरणियों और अन्य समान निर्माणों से अलग बनाती है।
रॉबर्ट

6

सूची की लंबाई का उपयोग यह जांचने के लिए सबसे तेज़ समाधान होगा कि क्या कोई सूचकांक मौजूद है:

def index_exists(ls, i):
    return (0 <= i < len(ls)) or (-len(ls) <= i < 0)

यह नकारात्मक सूचकांकों के लिए भी परीक्षण करता है, और अधिकांश अनुक्रम प्रकार (पसंद rangesऔर पसंद)str एस) जिनकी लंबाई होती है।

यदि आपको किसी भी तरह से बाद में उस इंडेक्स पर आइटम को एक्सेस करने की आवश्यकता है, तो अनुमति की तुलना में माफी मांगना आसान है , और यह तेजी से और अधिक पायथोनिक भी है। का उपयोग करें try: except:

try:
    item = ls[i]
    # Do something with item
except IndexError:
    # Do something without the item

यह निम्नानुसार होगा:

if index_exists(ls, i):
    item = ls[i]
    # Do something with item
else:
    # Do something without the item

3

यदि आप सम्मिलित किए गए एक्टर्स डेटा को पुनरावृत्त करना चाहते हैं:

for i in range(n):
    if len(nams[i]) > 3:
        do_something
    if len(nams[i]) > 4:
        do_something_else

1

ठीक है, इसलिए मुझे लगता है कि यह वास्तव में संभव है (तर्क के लिए):

>>> your_list = [5,6,7]
>>> 2 in zip(*enumerate(your_list))[0]
True
>>> 3 in zip(*enumerate(your_list))[0]
False

: हालांकि यह और भी आसान हो जाएगा3 in range(len(your_list)
avloss

1
या यहाँ तक कि इस 3 in xrange(len(your_list)- शायद इससे बेहतर नहीं कर सकते
avloss

1

आप कुछ इस तरह की कोशिश कर सकते हैं

list = ["a", "b", "C", "d", "e", "f", "r"]

for i in range(0, len(list), 2):
    print list[i]
    if len(list) % 2 == 1 and  i == len(list)-1:
        break
    print list[i+1];

1

एक लाइन:

do_X() if len(your_list) > your_index else do_something_else()  

पूर्ण उदाहरण:

In [10]: def do_X(): 
    ...:     print(1) 
    ...:                                                                                                                                                                                                                                      

In [11]: def do_something_else(): 
    ...:     print(2) 
    ...:                                                                                                                                                                                                                                      

In [12]: your_index = 2                                                                                                                                                                                                                       

In [13]: your_list = [1,2,3]                                                                                                                                                                                                                  

In [14]: do_X() if len(your_list) > your_index else do_something_else()                                                                                                                                                                      
1

सिर्फ जानकारी के लिए। इम्हो, try ... except IndexErrorबेहतर समाधान है।


-3

अपने कोष्ठकों के सामने कोई स्थान न रहने दें।

उदाहरण:

n = input ()
         ^

युक्ति: आपको अपने कोड के अंतर्गत और / या टिप्पणियों को जोड़ना चाहिए। अपने कोड के पीछे नहीं।


आपका दिन शुभ हो।


एसओ में आपका स्वागत है! आपका उत्तर उत्तर के बजाय टिप्पणी जैसा लगता है। एक बार जब आपके पास पर्याप्त प्रतिष्ठा होगी तो आप किसी भी पोस्ट पर टिप्पणी कर पाएंगे । इसके अलावा मैं क्या कर सकता हूं इसकी जांच करें । यदि आप उत्तर देने का इरादा रखते हैं, तो एसओ दिशानिर्देशों का पालन करने के लिए यह कैसे पढ़ें -उत्तर दें।
thewaywewere

-3

बहुत सारे उत्तर, सरल नहीं।

यह जांचने के लिए कि क्या कोई इंडेक्स 'आईडी' डिक्शनरी में मौजूद है:

dic = {}
dic['name'] = "joao"
dic['age']  = "39"

if 'age' in dic

सही है अगर 'उम्र' मौजूद है।


1
सवाल का अच्छा जवाब नहीं। सवाल सूचियों के बारे में था, शब्दकोष का नहीं। इस तरह के मामलों में आप क्या नहीं कर सकते हैं: ["
जोओ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.