2010-12-08 16 views
61

मेरे पास यह कोड है जो एक स्ट्रिंग में एक विशिष्ट वर्ण का सबसे बड़ा सूचकांक पाता है, हालांकि मैं इसे ValueError उठाना चाहता हूं जब निर्दिष्ट वर्ण स्ट्रिंग में नहीं होता है।ValueError कैसे बढ़ाएं?

तो कुछ इस तरह:

contains('bababa', 'k') 

एक परिणाम होगा:

ValueError: could not find k in bababa

मैं यह कैसे कर सकते हैं?

यहाँ मेरी समारोह के लिए वर्तमान कोड है:

def contains(string,char): 
    list = [] 

    for i in range(0,len(string)): 
     if string[i] == char: 
      list = list + [i] 

    return list[-1] 
+0

आपका प्रश्न क्या है? – Falmarri

+2

मैं ValueError – user531225

+3

कैसे बढ़ा सकता हूं, वैल्यूएरर() हाहाहा – slezica

उत्तर

112

raise ValueError('could not find %c in %s' % (ch,str))

9
>>> def contains(string, char): 
...  for i in xrange(len(string) - 1, -1, -1): 
...   if string[i] == char: 
...    return i 
...  raise ValueError("could not find %r in %r" % (char, string)) 
... 
>>> contains('bababa', 'k') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 5, in contains 
ValueError: could not find 'k' in 'bababa' 
>>> contains('bababa', 'a') 
5 
>>> contains('bababa', 'b') 
4 
>>> contains('xbababa', 'x') 
0 
>>> 
15

अपने कोड है जो अभी भी काम करता है की एक संशोधित संस्करण है प्लस यह कैसे एक ValueError जिस तरह से आप चाहते हैं बढ़ाने के लिए दिखाया गया है। वैसे, मुझे लगता है कि find_last(), find_last_index(), या कुछ सिमलर इस फ़ंक्शन के लिए एक और वर्णनात्मक नाम होगा।

def contains(char_string, char): 
    largest_index = -1 
    for i, ch in enumerate(char_string): 
     if ch == char: 
      largest_index = i 
    if largest_index > -1: # any found? 
     return largest_index # return index of last one 
    else: 
     raise ValueError('could not find {} in {}'.format(char, char_string)) 

print(contains('mississippi', 's')) # -> 6 
print(contains('bababa', 'k')) # -> 
Traceback (most recent call last): 
    File "how-to-raise-a-valueerror.py", line 15, in <module> 
    print(contains('bababa', 'k')) 
    File "how-to-raise-a-valueerror.py", line 12, in contains 
    raise ValueError('could not find {} in {}'.format(char, char_string)) 
ValueError: could not find k in bababa 

अपडेट - एक काफी सरल तरीके से

वाह! यहां एक बहुत अधिक संक्षिप्त संस्करण है-अनिवार्य रूप से एक-लाइनर-जो भी तेज़ी से संभव है क्योंकि यह पहले मिलान करने वाले चरित्र के लिए आगे की खोज करने से पहले स्ट्रिंग ([::-1] के माध्यम से) स्ट्रिंग करता है और यह तेजी से निर्मित- स्ट्रिंग index() विधि में। आपके वास्तविक प्रश्न के संबंध में, index() का उपयोग करने के साथ आता है कि एक अच्छी छोटी बोनस सुविधा यह है कि चरित्र सबस्ट्रिंग नहीं मिलने पर यह पहले से ही ValueError उठाता है, इसलिए ऐसा करने के लिए अतिरिक्त कुछ भी आवश्यक नहीं है।

यहाँ यह एक त्वरित इकाई परीक्षण के साथ है:

def contains(char_string, char): 
    # (-1 adjusts returned index to account for searching in reverse) 
    return len(char_string) - char_string[::-1].index(char) - 1 

print(contains('mississippi', 's')) # -> 6 
print(contains('bababa', 'k')) # -> 
Traceback (most recent call last): 
    File "better-way-to-raise-a-valueerror.py", line 9, in <module> 
    print(contains('bababa', 'k')) 
    File "better-way-to-raise-a-valueerror", line 6, in contains 
    return len(char_string) - char_string[::-1].index(char) - 1 
ValueError: substring not found 
+0

दूसरा फ़ंक्शन: ओपी को 'लूप' की आवश्यकता है/चाहता है। पहला कार्य: 'के लिए असफल' ('foo', 'f') '। –

+0

@ जॉन माचिन: ​​आपको पहले फंक्शन में मिली फिक्स्ड बग, इसे मेरे ध्यान में लाने के लिए धन्यवाद। मुझे ओपी के प्रश्न या नीचे दी गई टिप्पणियों में कुछ भी दिखाई नहीं देता है जो इंगित करता है कि उन्हें जवाब में 'लूप' की आवश्यकता है या नहीं, हालांकि कोई अपने कोड में प्रकट होता है।वैसे भी मेरा पहला फ़ंक्शन उन्हें दिखाता है कि 'ValueError' को कैसे बढ़ाया जाए जब चरित्र नहीं मिलता है * जो * उन्होंने पूछा था। और मैंने दिखाया है कि 'for' के संदर्भ में कैसे किया जाए। भले ही वे किसी कारण से 'के लिए' चाहते हैं, मुझे लगता है कि दूसरों को कम से कम कुछ हद तक दिलचस्प के बिना दूसरा संस्करण मिल सकता है। – martineau

+0

"मैं लूप के लिए उपयोग करना चाहता हूं :-)" @pyfunc –

0
>>> response='bababa' 
... if "K" in response.text: 
...  raise ValueError("Not found") 
+0

हालांकि यह कोड प्रश्न का उत्तर दे सकता है, इस बारे में अतिरिक्त संदर्भ प्रदान करता है कि यह कैसे और/या समस्या का समाधान क्यों करता है, इसका उत्तर उत्तर के दीर्घकालिक मूल्य में सुधार होगा। –

0

अजगर आप इस

के लिए fstrings उपयोग कर सकते हैं के नवीनतम संस्करण में की सुविधा देता है value = "Hello"

raise ValidationError(f"{value} is not valid category") 
संबंधित मुद्दे