কীভাবে একটি মূল্যবৃদ্ধি বাড়াতে?


115

আমার কাছে এই কোডটি রয়েছে যা একটি স্ট্রিংয়ের মধ্যে একটি নির্দিষ্ট অক্ষরের সর্বাধিক সূচী খুঁজে পায়, তবে আমি উল্লেখ করতে চাই ValueErrorযে নির্দিষ্ট বর্ণটি যখন স্ট্রিংয়ের সাথে না ঘটে তখন raise

সুতরাং এর মতো কিছু:

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: এতটাই অদ্ভুত যে এটি গণনার পরিবর্তে ডানদিকের ঘটনাস্থলের অবস্থানটি ফিরিয়ে দেয়।
জন মাচিন

@ এরিক অলিক: স্পষ্টতই, তিনি করেছেন — তিনি স্ট্যাকওভারফ্লোতে পোস্ট করেছেন। তাতে কী দোষ?
মাইকেল শ্যাপার 14

উত্তর:


178

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


2
আপনি কি জানতেন, আপনি যদি বার্তাটি ব্যবহার করতে না চান তবে আপনি কেবল raise ValueErrorপরিবর্তে করতে পারেন raise ValueError()?
টমাসজ গ্যান্ডার

27

এখানে আপনার কোডের একটি সংশোধিত সংস্করণ রয়েছে যা এখনও কাজ করে এবং এটি কীভাবে আপনার পছন্দমতো বাড়ানো যায় তা চিত্রিত করে ValueError। যাইহোক, আমি মনে করি find_last(), find_last_index()বা কিছু সিমলার এই ফাংশনটির জন্য আরও বর্ণনামূলক নাম হবে। সম্ভাব্য বিভ্রান্তিতে যোগ করার বিষয়টি হ'ল পাইথনের ইতিমধ্যে একটি ধারক অবজেক্ট পদ্ধতি রয়েছে __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'

আপডেট - একটি যথেষ্ট সহজ উপায়

কি দারুন! এখানে আরও সংক্ষিপ্ত সংস্করণটি দেওয়া হয়েছে - মূলত একটি ওয়ান লাইনার likely এটি সম্ভবত দ্রুততর কারণ এটি প্রথম মিলিত চরিত্রটির [::-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

2 য় ফাংশন: ওপি একটি forলুপ প্রয়োজন / চায় । 1 ম ফাংশন: ব্যর্থ contains('foo', 'f')
জন মাচিন

1
@ জন মাচিন: আপনি 1 ম ফাংশনে স্থির বাগ খুঁজে পেয়েছেন, এটি আমার নজরে আনার জন্য ধন্যবাদ thanks আমি ওপি-র প্রশ্নে বা এর নীচে থাকা মন্তব্যে এমন কিছুই দেখতে পাচ্ছি না যা ইঙ্গিত দেয় যে তাদের প্রয়োজন বা forউত্তরটিতে লুপ চান যদিও তাদের নিজস্ব কোডে উপস্থিত হওয়ার মতো ঘটনা ঘটে। যাহাই হউক না কেন আমার 1 ম ফাংশন শো তাদের কিভাবে raiseএকটি ValueErrorযখন চরিত্র পাওয়া যায় না যা হয় তারা যা জিজ্ঞাসা। এবং আমি চিত্রিত করেছি একটি এর প্রসঙ্গে কীভাবে করব for। এমনকি তারা forকোনও কারণে চাইলেও , আমি মনে করি অন্যরা কমপক্ষে কিছুটা আকর্ষণীয় না করেই দ্বিতীয় সংস্করণটি খুঁজে পেতে পারে।
মার্টিনিউ

"আমি লুপের জন্য ব্যবহার করতে চাই :-)" হ'ল এখনই মুছে ফেলা উত্তরের উত্তরটি @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
যদিও এই কোডটি প্রশ্নের উত্তর দিতে পারে, কীভাবে এবং / বা কেন এটি সমস্যার সমাধান করে তা সম্পর্কিত অতিরিক্ত প্রসঙ্গ সরবরাহ করলে উত্তরের দীর্ঘমেয়াদী মান উন্নত হবে।
ডোনাল্ড হাঁস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.