পাইথনে একটি স্ট্রিং বিপরীত করুন


1347

reverseপাইথনের strঅবজেক্টের জন্য কোনও বিল্ট ইন ফাংশন নেই । এই পদ্ধতিটি কার্যকর করার সর্বোত্তম উপায় কী?

যদি খুব সংক্ষিপ্ত উত্তর সরবরাহ করা হয় তবে দয়া করে এর দক্ষতাটি বিস্তারিতভাবে বর্ণনা করুন। উদাহরণস্বরূপ, strবস্তুটি অন্য কোনও বস্তুতে রূপান্তরিত হয়েছে কিনা ইত্যাদি whether


1
"ট্যাকোক্যাট" স্ট্রিংটি ব্যবহার করুন
জোনপিজা

উত্তর:


2648

কেমন:

>>> 'hello world'[::-1]
'dlrow olleh'

এটি প্রসারিত স্লাইস সিনট্যাক্স। এটি কাজ করে কাজ করে [begin:end:step]- শুরু করে শেষ করে এবং -1 এর একটি ধাপ নির্দিষ্ট করে, এটি একটি স্ট্রিংকে বিপরীত করে।


28
যদিও এটি utf8 এর জন্য কাজ করে না .. আমার পাশাপাশি এটি করাও প্রয়োজন b = a.decode('utf8')[::-1].encode('utf8')তবে সঠিক দিকের জন্য ধন্যবাদ!
রিকি লেভি

13
@ রিক্যলিভি যদি .decode('utf8')প্রয়োজন হয় তবে এর অর্থ aবাইটের চেয়ে কোনও স্ট্রিং অবজেক্ট নেই।
শিপলু মোকাদ্দিম

255

@ পাওলো s[::-1]দ্রুততম; একটি ধীর পন্থা (সম্ভবত আরও পাঠযোগ্য, তবে এটি বিতর্কযোগ্য) ''.join(reversed(s))


13
এটি প্রায় 3 গুণ ধীর।
নিজে 15

2
এবং এটি কী বলে তাড়াতাড়ি মন্তব্য করা এই ধীর সংস্করণটি ব্যবহার করার চেয়ে আরও ভাল ব্যাখ্যা করবে!
tburrows13

4
এটা ধীর কারণ join হয়েছে তালিকা তৈরী করতে যাহাই হউক না কেন আকার পেতে সক্ষম হবে। ''.join(list(reversed(s)))কিছুটা দ্রুত হতে পারে
জিন-ফ্রানসোয়া ফ্যাব্রে

[:: - 1] দ্রুততম কেন আপনার কাছে কোনও তথ্য আছে? আমি আরও গভীর ডুব দিতে চাই
ট্যানার

@ ট্যানার [:: - 1] দ্রুততম কারণ এটি কোনও বাহ্যিক ক্রিয়াকলাপ কল করে না, বরং এটি স্লাইসিং ব্যবহার করছে, যা পাইথনে উচ্চ-অনুকূলিত। '' .জয়িন (তালিকা (বিপরীত (গুলি)) 3 ফাংশন কল করে।
এইচডি 1

217

স্ট্রিংগুলির জন্য একটি বিপরীত ফাংশন বাস্তবায়নের সর্বোত্তম উপায় কী?

এই প্রশ্নের সাথে আমার নিজের অভিজ্ঞতা একাডেমিক। তবে, আপনি যদি দ্রুত উত্তরটির সন্ধানকারী হন তবে একটি স্লাইস ব্যবহার করুন যা এর দ্বারা পদক্ষেপ নেয় -1:

>>> 'a string'[::-1]
'gnirts a'

বা আরও পড়তে পারা যায় (তবে পদ্ধতিটির নাম অনুসন্ধানের কারণে ধীরে ধীরে এবং পুনরুক্তি দেওয়ার সময় তালিকার সাথে যুক্ত হওয়ার কারণে) str.join,:

>>> ''.join(reversed('a string'))
'gnirts a'

বা পঠনযোগ্যতা এবং পুনঃব্যবহারযোগ্যতার জন্য স্লাইসটি একটি ফাংশনে রাখুন

def reversed_string(a_string):
    return a_string[::-1]

এবং তারপর:

>>> reversed_string('a_string')
'gnirts_a'

দীর্ঘ ব্যাখ্যা

আপনি যদি একাডেমিক বর্ণনায় আগ্রহী হন তবে অনুগ্রহ করে পড়া চালিয়ে যান।

পাইথনের str অবজেক্টে কোনও বিল্ট-ইন রিভার্স ফাংশন নেই।

পাইথনের স্ট্রিং সম্পর্কে আপনার কয়েকটি জিনিস সম্পর্কে জানা উচিত:

  1. পাইথনে, স্ট্রিং অপরিবর্তনীয় । স্ট্রিং পরিবর্তন করা স্ট্রিংকে পরিবর্তন করে না। এটি একটি নতুন তৈরি করে।

  2. স্ট্রিংগুলি স্লাইসযোগ্য। স্ট্রিং স্লাইজিং আপনাকে প্রদত্ত ইনক্রিমেন্টের সাহায্যে স্ট্রিংয়ের এক বিন্দু থেকে পিছন বা ফরোয়ার্ডে অন্য বিন্দুতে একটি নতুন স্ট্রিং দেয়। তারা সাবস্ক্রিপ্টে স্লাইস নোটেশন বা একটি স্লাইস অবজেক্ট নেয়:

    string[subscript]

সাবস্ক্রিপ্ট বন্ধনীগুলির মধ্যে একটি কোলন অন্তর্ভুক্ত করে একটি স্লাইস তৈরি করে:

    string[start:stop:step]

ধনুর্বন্ধনী বাইরে একটি স্লাইস তৈরি করতে, আপনি একটি স্লাইস অবজেক্ট তৈরি করতে হবে:

    slice_obj = slice(start, stop, step)
    string[slice_obj]

একটি পঠনযোগ্য পদ্ধতি:

''.join(reversed('foo'))পাঠযোগ্য, যদিও এটির জন্য স্ট্রিং পদ্ধতিটি কল করা প্রয়োজন str.join, অন্য নামক ফাংশনে, যা তুলনামূলকভাবে ধীর হতে পারে। এটি একটি ফাংশনে রাখি - আমরা এটিতে ফিরে আসব:

def reverse_string_readable_answer(string):
    return ''.join(reversed(string))

সর্বাধিক পারফরম্যান্ট পদ্ধতি:

বিপরীত স্লাইস ব্যবহার করে খুব দ্রুত ব্যবহার করা হচ্ছে:

'foo'[::-1]

তবে আমরা কীভাবে টুকরো বা মূল লেখকের অভিপ্রায় সম্পর্কে কম পরিচিত কারও কাছে এটি আরও পঠনযোগ্য এবং বোধগম্য করতে পারি? আসুন সাবস্ক্রিপ্ট স্বরলিপির বাইরে একটি স্লাইস অবজেক্ট তৈরি করি, এটি একটি বর্ণনামূলক নাম দিন এবং এটি সাবস্ক্রিপ্ট নোটেশনে পাস করুন।

start = stop = None
step = -1
reverse_slice = slice(start, stop, step)
'foo'[reverse_slice]

ফাংশন হিসাবে প্রয়োগ করুন

এটি আসলে একটি ফাংশন হিসাবে বাস্তবায়িত করার জন্য, আমি মনে করি এটি বর্ণনামূলক নামটি ব্যবহার করার জন্য এটি শব্দার্থগতভাবে যথেষ্ট স্পষ্ট:

def reversed_string(a_string):
    return a_string[::-1]

এবং ব্যবহার সহজভাবে:

reversed_string('foo')

আপনার শিক্ষক সম্ভবত যা চান:

আপনার যদি কোনও প্রশিক্ষক থাকে তবে তারা সম্ভবত চান যে আপনি একটি খালি স্ট্রিং দিয়ে শুরু করুন এবং পুরানোটির থেকে একটি নতুন স্ট্রিং তৈরি করুন। আপনি খাঁটি বাক্য গঠন এবং আক্ষরিক সাথে কিছুক্ষণ লুপ ব্যবহার করে এটি করতে পারেন:

def reverse_a_string_slowly(a_string):
    new_string = ''
    index = len(a_string)
    while index:
        index -= 1                    # index = index - 1
        new_string += a_string[index] # new_string = new_string + character
    return new_string

এটি তাত্ত্বিকভাবে খারাপ কারণ, মনে রাখবেন, স্ট্রিংগুলি অপরিবর্তনীয় - সুতরাং প্রতিবার যেখানে মনে হচ্ছে আপনি নিজের চরিত্রটি যুক্ত করছেন new_string, তাত্ত্বিকভাবে এটি প্রতিবার একটি নতুন স্ট্রিং তৈরি করছে! তবে সিপিথন জানেন যে কয়েকটি ক্ষেত্রে এটি কীভাবে অনুকূল করা যায়, যার মধ্যে এই তুচ্ছ ঘটনা একটি।

ভাল অভ্যাস

তাত্ত্বিকভাবে আরও ভাল একটি তালিকাতে আপনার সাবস্ট্রিংগুলি সংগ্রহ করা এবং পরে সেগুলিতে যোগদান করা:

def reverse_a_string_more_slowly(a_string):
    new_strings = []
    index = len(a_string)
    while index:
        index -= 1                       
        new_strings.append(a_string[index])
    return ''.join(new_strings)

তবে, আমরা সিপিথনের নীচের সময়গুলিতে দেখতে পাচ্ছি, এটি আসলে আরও বেশি সময় নেয়, কারণ সিপিথন স্ট্রিং কনটেনটেশনকে অনুকূল করতে পারে।

সময়

সময়গুলি এখানে:

>>> a_string = 'amanaplanacanalpanama' * 10
>>> min(timeit.repeat(lambda: reverse_string_readable_answer(a_string)))
10.38789987564087
>>> min(timeit.repeat(lambda: reversed_string(a_string)))
0.6622700691223145
>>> min(timeit.repeat(lambda: reverse_a_string_slowly(a_string)))
25.756799936294556
>>> min(timeit.repeat(lambda: reverse_a_string_more_slowly(a_string)))
38.73570013046265

সিপিথন স্ট্রিং কনটেনটেশনকে সর্বোত্তম করে তোলে, যেখানে অন্যান্য বাস্তবায়ন নাও করতে পারে :

... ফাইলে a + = b বা a = a + b আকারে বিবৃতিগুলির জন্য সিপিথনের ইন-প্লেস স্ট্রিং কনটেনটেশনের কার্যকর প্রয়োগের উপর নির্ভর করবেন না। এই অপ্টিমাইজেশনটি সিপিথনেও নাজুক (এটি কেবল কিছু ধরণের জন্য কাজ করে) এবং বাস্তবায়নগুলিতে একেবারেই উপস্থিত হয় না যা পুনরায় গণনা ব্যবহার করে না। গ্রন্থাগারের কর্মক্ষমতা সংবেদনশীল অংশগুলিতে পরিবর্তে '' .জয়াইন () ফর্মটি ব্যবহার করা উচিত। এটি নিশ্চিত করবে যে বিভিন্ন বাস্তবায়ন জুড়ে রৈখিক সময়ে সংমিশ্রণ ঘটে।


4
আমি এই উত্তরটি, অপ্টিমাইজেশান সম্পর্কিত ব্যাখ্যা, পাঠযোগ্যতা বনাম অপ্টিমাইজেশন, শিক্ষক কী চান তার টিপসটি পছন্দ করি। আমি সেরা অনুশীলনের অধ্যায় সম্পর্কে নিশ্চিত নই while, এবং সূচক decrementing যদিও সম্ভবত এই কম পাঠযোগ্য: for i in range(len(a_string)-1, -1, -1): । আমি সবচেয়ে পছন্দ করি যে আপনি উদাহরণস্বরূপ যে স্ট্রিংটি বেছে নিয়েছেন সেটি হ'ল এমন একটি ক্ষেত্রে যেখানে আপনার কখনই এটির বিপরীত হওয়া প্রয়োজন হবে না এবং আপনি কী তা বলতে পারবেন না :)
দাভোস

37

দ্রুত উত্তর (টিএল; ডিআর)

উদাহরণ

### example01 -------------------
mystring  =   'coup_ate_grouping'
backwards =   mystring[::-1]
print backwards

### ... or even ...
mystring  =   'coup_ate_grouping'[::-1]
print mystring

### result01 -------------------
'''
gnipuorg_eta_puoc
'''

বিস্তারিত উত্তর

পটভূমি

এই উত্তরটি @ উত্সাহ থেকে নিম্নলিখিত উদ্বেগের সমাধান করার জন্য সরবরাহ করা হয়েছে:

কি দারুন. পাওলো প্রস্তাবিত সমাধানটি শুনে আমি প্রথমে আতঙ্কিত হয়ে পড়েছিলাম, তবে প্রথম মন্তব্যটি পড়ে আমার যে বীভৎসতা অনুভূত হয়েছিল তা ফিরে পেয়েছিল: "এটি খুব অদ্ভুত। ভাল কাজ!" আমি এতটা বিচলিত যে এই জাতীয় উজ্জ্বল সম্প্রদায় মনে করে যে এত কিছু মৌলিক কিছুর জন্য এই ধরনের ক্রিপ্টিক পদ্ধতি ব্যবহার করা ভাল ধারণা। কেন এটি শুধু s.revers () নয়?

সমস্যা

  • প্রসঙ্গ
    • পাইথন 2.x
    • পাইথন 3.x
  • দৃশ্যপট:
    • বিকাশকারী একটি স্ট্রিং রূপান্তর করতে চায়
    • রূপান্তরটি হ'ল সমস্ত চরিত্রের ক্রমকে বিপরীত করা

সমাধান

pitfalls

  • বিকাশকারী এরকম কিছু আশা করতে পারে string.reverse()
  • নেটিভ ইডিয়োম্যাটিক (ওরফে " পাইথোনিক ") সমাধানটি নতুন বিকাশকারীদের কাছে পঠনযোগ্য নয়
  • বিকাশকারী string.reverse()স্লাইস স্বরলিপি এড়ানোর জন্য তার নিজস্ব সংস্করণটি প্রয়োগ করতে প্ররোচিত হতে পারে ।
  • স্লাইস স্বরলিপি আউটপুট কিছু ক্ষেত্রে পাল্টা স্বজ্ঞাত হতে পারে:
    • উদাহরণস্বরূপ, দেখুন02
      • print 'coup_ate_grouping'[-4:] ## => 'ping'
      • তুলনা করা
      • print 'coup_ate_grouping'[-4:-1] ## => 'pin'
      • তুলনা করা
      • print 'coup_ate_grouping'[-1] ## => 'g'
    • সূচকের বিভিন্ন ফলাফল [-1]কিছু বিকাশকারীকে ফেলে দিতে পারে

যুক্তিসহ ব্যাখ্যা

পাইথনের সচেতন হওয়ার জন্য একটি বিশেষ পরিস্থিতি রয়েছে: একটি স্ট্রিং একটি পুনরাবৃত্তিযোগ্য প্রকার।

কোনও string.reverse()পদ্ধতি বাদ না দেওয়ার একটি যুক্তি হ'ল পাইথন বিকাশকারীদের এই বিশেষ পরিস্থিতিতে শক্তি অর্জনের জন্য উত্সাহ দেওয়া।

সরল ভাষায়, এর সহজ অর্থ হ'ল স্ট্রিংয়ের প্রতিটি স্বতন্ত্র চরিত্র সহজেই অন্যান্য প্রোগ্রামিং ভাষায় অ্যারেগুলির মতো উপাদানগুলির ক্রমিক বিন্যাসের অংশ হিসাবে সহজেই পরিচালনা করা যায়।

এটি কীভাবে কাজ করে তা বুঝতে, উদাহরণস্বরূপ2 টি পর্যালোচনা করা একটি ভাল ওভারভিউ সরবরাহ করতে পারে।

Example02

### example02 -------------------
## start (with positive integers)
print 'coup_ate_grouping'[0]  ## => 'c'
print 'coup_ate_grouping'[1]  ## => 'o' 
print 'coup_ate_grouping'[2]  ## => 'u' 

## start (with negative integers)
print 'coup_ate_grouping'[-1]  ## => 'g'
print 'coup_ate_grouping'[-2]  ## => 'n' 
print 'coup_ate_grouping'[-3]  ## => 'i' 

## start:end 
print 'coup_ate_grouping'[0:4]    ## => 'coup'    
print 'coup_ate_grouping'[4:8]    ## => '_ate'    
print 'coup_ate_grouping'[8:12]   ## => '_gro'    

## start:end 
print 'coup_ate_grouping'[-4:]    ## => 'ping' (counter-intuitive)
print 'coup_ate_grouping'[-4:-1]  ## => 'pin'
print 'coup_ate_grouping'[-4:-2]  ## => 'pi'
print 'coup_ate_grouping'[-4:-3]  ## => 'p'
print 'coup_ate_grouping'[-4:-4]  ## => ''
print 'coup_ate_grouping'[0:-1]   ## => 'coup_ate_groupin'
print 'coup_ate_grouping'[0:]     ## => 'coup_ate_grouping' (counter-intuitive)

## start:end:step (or start:end:stride)
print 'coup_ate_grouping'[-1::1]  ## => 'g'   
print 'coup_ate_grouping'[-1::-1] ## => 'gnipuorg_eta_puoc'

## combinations
print 'coup_ate_grouping'[-1::-1][-4:] ## => 'puoc'

উপসংহার

জ্ঞানীয় লোড বুঝতে কিভাবে পাইথন মধ্যে ছে স্বরলিপি কাজ প্রকৃতপক্ষে কিছু গ্রহীতারা এবং বিকাশকারীরা ভাষা শেখার মধ্যে অনেক সময় বিনিয়োগ করতে চাই না যারা জন্য খুব বেশী হতে পারে সঙ্গে যুক্ত।

তবুও, একবারে মূল নীতিগুলি বোঝা গেলে, স্থির স্ট্রিং ম্যানিপুলেশন পদ্ধতির উপর এই পদ্ধতির শক্তি বেশ অনুকূল হতে পারে।

যারা অন্যথায় ভাবেন তাদের জন্য বিকল্প উপায় আছে যেমন ল্যাম্বদা ফাংশন, পুনরাবৃত্তিকারী বা সাধারণ এক-অফ ফাংশন ঘোষণার।

যদি ইচ্ছা হয় তবে কোনও বিকাশকারী তার নিজস্ব স্ট্রিং.রেভার () পদ্ধতি প্রয়োগ করতে পারে তবে পাইথনের এই দিকটির পিছনে যুক্তি বোঝা ভাল।

আরো দেখুন


17

ইউনিকোড সংশোধক / গ্রাফি ক্লাস্টারগুলি উপেক্ষা করা হলে বিদ্যমান উত্তরগুলি কেবলমাত্র সঠিক। আমি পরে এটি মোকাবেলা করব, তবে প্রথমে কিছু বিপরীত অ্যালগরিদমের গতি দেখুন:

এখানে চিত্র বর্ণনা লিখুন

list_comprehension  : min:   0.6μs, mean:   0.6μs, max:    2.2μs
reverse_func        : min:   1.9μs, mean:   2.0μs, max:    7.9μs
reverse_reduce      : min:   5.7μs, mean:   5.9μs, max:   10.2μs
reverse_loop        : min:   3.0μs, mean:   3.1μs, max:    6.8μs

এখানে চিত্র বর্ণনা লিখুন

list_comprehension  : min:   4.2μs, mean:   4.5μs, max:   31.7μs
reverse_func        : min:  75.4μs, mean:  76.6μs, max:  109.5μs
reverse_reduce      : min: 749.2μs, mean: 882.4μs, max: 2310.4μs
reverse_loop        : min: 469.7μs, mean: 577.2μs, max: 1227.6μs

আপনি দেখতে পাচ্ছেন যে তালিকাটি বোঝার জন্য সময়টি ( reversed = string[::-1]) সমস্ত ক্ষেত্রেই সর্বনিম্ন (আমার টাইপ ঠিক করার পরেও) is

স্ট্রিং রিভার্সাল

আপনি যদি সাধারণ অর্থে সত্যিই কোনও স্ট্রিংটি বিপরীত করতে চান তবে এটি আরও জটিল। উদাহরণস্বরূপ, নীচের স্ট্রিংটি নিন ( বাদামী আঙুলটি বামদিকে দেখায় , হলুদ আঙুলের দিকে নির্দেশ করছে )। এগুলি দুটি গ্রাফিম, তবে 3 ইউনিকোড কোড পয়েন্ট। অতিরিক্ত একটি হ'ল ত্বকের সংশোধক

example = "👈🏾👆"

তবে আপনি যদি প্রদত্ত যে কোনও পদ্ধতির সাথে এটির বিপরীত হন, আপনি বাদামী আঙুলটি পয়েন্ট আপ করতে হবে , বামদিকে হলুদ আঙুলের নির্দেশক । এর কারণ হ'ল "ব্রাউন" কালার মডিফায়ারটি এখনও মাঝখানে রয়েছে এবং যা কিছু আছে তার আগে প্রয়োগ হয়। তাহলে আমাদের আছে

  • ইউ: আঙুল দেখানো
  • এম: ব্রাউন মডিফায়ার
  • এল: আঙুলটি বাম দিকে ting

এবং

original: LMU
reversed: UML (above solutions)
reversed: ULM (correct reversal)

ইউনিকোড গ্রাফেম ক্লাস্টারগুলি কেবলমাত্র সংশোধক কোড পয়েন্টগুলির চেয়ে কিছুটা জটিল। ভাগ্যক্রমে, গ্রাফিমগুলি পরিচালনা করার জন্য একটি গ্রন্থাগার রয়েছে :

>>> import grapheme
>>> g = grapheme.graphemes("👈🏾👆")
>>> list(g)
['👈🏾', '👆']

এবং তাই সঠিক উত্তর হবে

def reverse_graphemes(string):
    g = list(grapheme.graphemes(string))
    return ''.join(g[::-1])

যা এখন পর্যন্ত সবচেয়ে ধীর:

list_comprehension  : min:    0.5μs, mean:    0.5μs, max:    2.1μs
reverse_func        : min:   68.9μs, mean:   70.3μs, max:  111.4μs
reverse_reduce      : min:  742.7μs, mean:  810.1μs, max: 1821.9μs
reverse_loop        : min:  513.7μs, mean:  552.6μs, max: 1125.8μs
reverse_graphemes   : min: 3882.4μs, mean: 4130.9μs, max: 6416.2μs

কোড

#!/usr/bin/env python

import numpy as np
import random
import timeit
from functools import reduce
random.seed(0)


def main():
    longstring = ''.join(random.choices("ABCDEFGHIJKLM", k=2000))
    functions = [(list_comprehension, 'list_comprehension', longstring),
                 (reverse_func, 'reverse_func', longstring),
                 (reverse_reduce, 'reverse_reduce', longstring),
                 (reverse_loop, 'reverse_loop', longstring)
                 ]
    duration_list = {}
    for func, name, params in functions:
        durations = timeit.repeat(lambda: func(params), repeat=100, number=3)
        duration_list[name] = list(np.array(durations) * 1000)
        print('{func:<20}: '
              'min: {min:5.1f}μs, mean: {mean:5.1f}μs, max: {max:6.1f}μs'
              .format(func=name,
                      min=min(durations) * 10**6,
                      mean=np.mean(durations) * 10**6,
                      max=max(durations) * 10**6,
                      ))
        create_boxplot('Reversing a string of length {}'.format(len(longstring)),
                       duration_list)


def list_comprehension(string):
    return string[::-1]


def reverse_func(string):
    return ''.join(reversed(string))


def reverse_reduce(string):
    return reduce(lambda x, y: y + x, string)


def reverse_loop(string):
    reversed_str = ""
    for i in string:
        reversed_str = i + reversed_str
    return reversed_str


def create_boxplot(title, duration_list, showfliers=False):
    import seaborn as sns
    import matplotlib.pyplot as plt
    import operator
    plt.figure(num=None, figsize=(8, 4), dpi=300,
               facecolor='w', edgecolor='k')
    sns.set(style="whitegrid")
    sorted_keys, sorted_vals = zip(*sorted(duration_list.items(),
                                           key=operator.itemgetter(1)))
    flierprops = dict(markerfacecolor='0.75', markersize=1,
                      linestyle='none')
    ax = sns.boxplot(data=sorted_vals, width=.3, orient='h',
                     flierprops=flierprops,
                     showfliers=showfliers)
    ax.set(xlabel="Time in ms", ylabel="")
    plt.yticks(plt.yticks()[0], sorted_keys)
    ax.set_title(title)
    plt.tight_layout()
    plt.savefig("output-string.png")


if __name__ == '__main__':
    main()

10

1. স্লাইস স্বরলিপি ব্যবহার করে

def rev_string(s): 
    return s[::-1]

2. বিপরীত () ফাংশন ব্যবহার করে

def rev_string(s): 
    return ''.join(reversed(s))

৩. পুনরাবৃত্তি ব্যবহার করে

def rev_string(s): 
    if len(s) == 1:
        return s

    return s[-1] + rev_string(s[:-1])

1
পুনরাবৃত্তির সমাধানটি দেখতে হবে, যদি স্ট্রিংটি আপনার দৈর্ঘ্যের দৈর্ঘ্যের হয় তবে RecursionError: maximum recursion depth exceeded while calling a Python object। প্রাক্তন:rev_string("abcdef"*1000)
অ্যাডাম পার্কিন

9

এটি দেখার একটি কম বিভ্রান্তিকর উপায় হ'ল:

string = 'happy'
print(string)

'খুশি'

string_reversed = string[-1::-1]
print(string_reversed)

'Yppah'

ইংরেজিতে [-1 :: - 1] পড়েন:

"-1 থেকে শুরু করে, -1 এর পদক্ষেপ নিয়ে সমস্ত পথে যান"


2
-1এখনো অপ্রয়োজনীয় হয়, যদিও।
এরিক ডুমিনিল

7

বিপরীত () বা [:: - 1] ব্যবহার না করে পাইথনে স্ট্রিংকে বিপরীত করুন

def reverse(test):
    n = len(test)
    x=""
    for i in range(n-1,-1,-1):
        x += test[i]
    return x

1
পাইথন 2-তে আপনার তালিকাটির দরকার নেই বলে আপনার কি xrange ব্যবহার করা উচিত নয়?
ইউনিটাস ব্রুকস

5

এটি একটি আকর্ষণীয় উপায়:

def reverse_words_1(s):
    rev = ''
    for i in range(len(s)):
        j = ~i  # equivalent to j = -(i + 1)
        rev += s[j]
    return rev

অথবা সাদৃশ্যপূর্ণ:

def reverse_words_2(s):
    rev = ''
    for i in reversed(range(len(s)):
        rev += s[i]
    return rev

বাইটারেরে ব্যবহার করে আরও একটি 'বহিরাগত' উপায় যা .revers () সমর্থন করে

b = bytearray('Reverse this!', 'UTF-8')
b.reverse()
b.decode('UTF-8')

উত্পাদন করবে:

'!siht esreveR'

3
def reverse(input):
    return reduce(lambda x,y : y+x, input)

3
আমি উপরে ক্লিক করেছি, কারণ আমি এই ল্যাম্বডা এক্সপ্রেশনটি পছন্দ করি। দুর্ভাগ্যক্রমে, এটি উপরের তালিকাভুক্ত সমস্ত থেকে
স্বল্প

2
original = "string"

rev_index = original[::-1]
rev_func = list(reversed(list(original))) #nsfw

print(original)
print(rev_index)
print(''.join(rev_func))

1
যদিও এই কোডটি প্রশ্নের উত্তর দিতে পারে, কীভাবে সমস্যাটি সমাধান করবেন এবং উদাহরণ বা রেফারেন্স হিসাবে কোডটি কীভাবে সরবরাহ করবেন তা আরও ভাল। কোড-কেবল উত্তরগুলি বিভ্রান্তিকর হতে পারে এবং প্রসঙ্গের অভাব হতে পারে।
রবার্ট কলম্বিয়া

1
def reverse_string(string):
    length = len(string)
    temp = ''
    for i in range(length):
        temp += string[length - i - 1]
    return temp

print(reverse_string('foo')) #prints "oof"

এটি স্ট্রিংয়ের মধ্য দিয়ে লুপিং করে এবং এর মানগুলিকে বিপরীত ক্রমে অন্য স্ট্রিংকে নির্ধারিত করে কাজ করে।



0

এখানে ( [::-1]বা reversedশেখার উদ্দেশ্যে) ছাড়া একটি এখানে রয়েছে :

def reverse(text):
    new_string = []
    n = len(text)
    while (n > 0):
        new_string.append(text[n-1])
        n -= 1
    return ''.join(new_string)
print reverse("abcd")

আপনি +=স্ট্রিংস কনটেনেট করতে ব্যবহার করতে পারেন তবে join()দ্রুত।


0

পুনরাবৃত্তির পদ্ধতি:

def reverse(s): return s[0] if len(s)==1 else s[len(s)-1] + reverse(s[0:len(s)-1])

উদাহরণ:

print(reverse("Hello!"))    #!olleH

0

উপরের সমস্ত সমাধানগুলি নিখুঁত তবে আমরা যদি পাইথনের লুপের জন্য একটি স্ট্রিংটি বিপরীত করার চেষ্টা করি তবে এটি কিছুটা জটিল হয়ে উঠবে তাই এখানে আমরা কীভাবে লুপের সাহায্যে একটি স্ট্রিংকে বিপরীত করতে পারি is

string ="hello,world"
for i in range(-1,-len(string)-1,-1):
    print (string[i],end=(" ")) 

আমি আশা করি এটি কারও জন্য সহায়ক হবে।


0

এটা আমার পথ:

def reverse_string(string):
    character_list = []
    for char in string:
        character_list.append(char)
    reversed_string = ""
    for char in reversed(character_list):
        reversed_string += char
    return reversed_string

0

স্ট্রিংটিকে বিপরীত করার জন্য অনেকগুলি উপায় রয়েছে তবে আমি কেবল মজাদার জন্য অন্য একটি তৈরি করেছি। আমি মনে করি এই পদ্ধতিটি খুব খারাপ নয়।

def reverse(_str):
    list_char = list(_str) # Create a hypothetical list. because string is immutable

    for i in range(len(list_char)/2): # just t(n/2) to reverse a big string
        list_char[i], list_char[-i - 1] = list_char[-i - 1], list_char[i]

    return ''.join(list_char)

print(reverse("Ehsan"))

0

এই শ্রেণিটি স্ট্রিংটিকে বিপরীতে ফেলার জন্য পাইথন ম্যাজিক ফাংশন ব্যবহার করে:

class Reverse(object):
    """ Builds a reverse method using magic methods """

    def __init__(self, data):
        self.data = data
        self.index = len(data)


    def __iter__(self):
        return self

    def __next__(self):
        if self.index == 0:
            raise StopIteration

        self.index = self.index - 1
        return self.data[self.index]


REV_INSTANCE = Reverse('hello world')

iter(REV_INSTANCE)

rev_str = ''
for char in REV_INSTANCE:
    rev_str += char

print(rev_str)  

আউটপুট

dlrow olleh

উল্লেখ


-1

পাইথন 3 এর সাহায্যে আপনি জায়গায় জায়গায় স্ট্রিংটি বিপরীত করতে পারেন অর্থাত এটি অন্য ভেরিয়েবলের জন্য বরাদ্দ পাবেন না। প্রথমে আপনাকে স্ট্রিংটিকে একটি তালিকায় রূপান্তর করতে হবে এবং তারপরে reverse()ফাংশনটি উত্তোলন করতে হবে।

https://docs.python.org/3/tutorial/datastructures.html

   def main():
        my_string = ["h","e","l","l","o"]
        print(reverseString(my_string))

    def reverseString(s):
      print(s)
      s.reverse()
      return s

    if __name__ == "__main__":
        main()

-2

এটি সহজ এবং অর্থবহ বিপরীত ফাংশন, বোঝা সহজ এবং কোড

def reverse_sentence(text):
    words = text.split(" ")
    reverse =""
    for word in reversed(words):
        reverse += word+ " "
    return reverse

যদিও এটি লেখকদের প্রশ্নের উত্তর দিতে পারে, এতে কিছু ব্যাখ্যাকারী শব্দ এবং / অথবা ডকুমেন্টেশনের লিঙ্কের অভাব রয়েছে। আশেপাশে কিছু বাক্যাংশ ছাড়া কাঁচা কোড স্নিপেটগুলি খুব বেশি সহায়ক হয় না। আপনি কীভাবে একটি ভাল উত্তর লিখতে পারেন তা খুব সহায়ক। আপনার উত্তর সম্পাদনা করুন।
হেলো

-3

এখানে সহজভাবে:

"লরেমিপসাম" মুদ্রণ করুন [- 1 :: - 1]

এবং কিছু যৌক্তিকভাবে:

def str_reverse_fun():
    empty_list = []
    new_str = 'loremipsum'
    index = len(new_str)
    while index:
        index = index - 1
        empty_list.append(new_str[index])
    return ''.join(empty_list)
print str_reverse_fun()

আউটপুট:

muspimerol


-4

পাইথন যাদু ছাড়া একটি স্ট্রিং বিপরীত করুন।

>>> def reversest(st):
    a=len(st)-1
    for i in st:
        print(st[a],end="")
        a=a-1

বিপরীতে স্ট্রিং প্রিন্ট করা কোনও স্ট্রিংকে বিপরীত করার চেয়ে আলাদা কিছু
মার্টিন থোমা

-5

অবশ্যই, পাইথনে আপনি খুব অভিনব 1-লাইনের স্টাফ করতে পারেন। :)
এখানে একটি সাধারণ, সমস্ত রাউন্ডার সমাধান যা কোনও প্রোগ্রামিং ভাষায় কাজ করতে পারে।

def reverse_string(phrase):
    reversed = ""
    length = len(phrase)
    for i in range(length):
        reversed += phrase[length-1-i]
    return reversed

phrase = raw_input("Provide a string: ")
print reverse_string(phrase)

1
এ জাতীয় তুচ্ছ কাজের জন্য এত দীর্ঘ কোড থাকা ভাল সমাধান নয়।
হান্টার_71

-5
s = 'hello'
ln = len(s)
i = 1
while True:
    rev = s[ln-i]
    print rev,
    i = i + 1
    if i == ln + 1 :
        break

আউটপুট:

o l l e h

-7

আপনি বিপরীতমুখী ফাংশনটি তালিকা বোধগম্য করে ব্যবহার করতে পারেন। তবে আমি বুঝতে পারি না কেন অজগর 3 এ এই পদ্ধতিটি নির্মূল করা হয়েছিল, অযথা ছিল।

string = [ char for char in reversed(string)]

প্রশ্নটি একটি স্ট্রিংয়ের বিপরীতে চেয়েছে, এবং আপনি পরিবর্তে একটি তালিকা দিয়েছেন ??
ব্যবহারকারী 21820

.joinএটির একটি বৈধ উত্তর দেওয়ার জন্য আপনার একটি বা কিছু দরকার
AsheKetchum

1
বিটিডাব্লু, [c for c in string]এর সমতুল্য list(string)
ডান পা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.