ValueError कैसे बढ़ाएं?


115

मेरे पास यह कोड है जो एक स्ट्रिंग में एक विशिष्ट वर्ण का सबसे बड़ा सूचकांक पाता है, हालांकि मैं यह चाहूंगा कि 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]

5
ठीक उसी तरह,
मान बढ़ाएं

@ user531225: क्या आप कुछ अन्य उत्तर स्वीकार कर सकते हैं ताकि मैं अपना डिलीट कर सकूं। धन्यवाद :)
pyfunc

@ THC4k: इतना अजीब कि यह गिनती के बजाय सबसे सही घटना की स्थिति देता है।
जॉन माकिन

@ ErikAllik: जाहिर है, उन्होंने किया - उन्होंने StackOverflow में पोस्ट किया। इसमें गलत क्या है?
माइकल शेपर

जवाबों:


178

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


2
क्या आप जानते हैं कि, यदि आप संदेश का उपयोग नहीं करना चाहते हैं, तो आप raise ValueErrorइसके बजाय बस कर सकते हैं raise ValueError()?
टॉमस गैंडर

27

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

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 {!r} in {!r}'.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):
    #  Ending - 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

दूसरा कार्य: ओपी को एक forलूप की आवश्यकता होती है । पहला समारोह: के लिए विफल contains('foo', 'f')
जॉन माकिन

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

"मैं लूप के लिए उपयोग करना चाहता हूं :-)" @pyfunc द्वारा अब हटाए गए उत्तर के लिए एक प्रारंभिक टिप्पणी थी
जॉन मैकिन

1
@ जॉन माचिन: ​​मुझे नहीं लगता कि हटाए गए उत्तरों की टिप्पणियों में अनुरोधों का सम्मान नहीं करने के लिए मुझे जिम्मेदार ठहराया जा सकता है जो मैंने नहीं देखा और न ही देख सकता हूं। हालांकि, भले ही मेरी 2nd समारोह एक का उपयोग नहीं करता forपाश, यह है एक तरह से करने के बारे में वास्तविक सवाल यह है कि जवाब देने के raiseएक ValueErrorजब चरित्र स्ट्रिंग में नहीं मिला है - अर्थात् है कि यह आप के लिए करता है कुछ और फोन करके। इस बात की भी संभावना है कि ओपी अपने- forउपसंहार या जो कुछ भी हो सकता है, वह एक forसमाधान देखने के बाद हो सकता है या बाद में पायथन के साथ अधिक परिचित हो सकता है।
मार्टिन्यू

12
>>> 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
>>>

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

1
हालांकि यह कोड प्रश्न का उत्तर दे सकता है, लेकिन समस्या को हल करने के तरीके के बारे में अतिरिक्त संदर्भ प्रदान करता है और यह समस्या को हल करता है ताकि उत्तर के दीर्घकालिक मूल्य में सुधार हो सके।
डोनाल्ड डक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.