अजगर में एक स्ट्रिंग को उल्टा करें


1348

reverseपायथन की strवस्तु के लिए कोई फ़ंक्शन नहीं बनाया गया है । इस विधि को लागू करने का सबसे अच्छा तरीका क्या है?

यदि बहुत संक्षिप्त उत्तर की आपूर्ति हो रही है, तो कृपया इसकी दक्षता पर विस्तार से बताएं। उदाहरण के लिए, क्या strवस्तु को किसी भिन्न वस्तु में परिवर्तित किया जाता है, आदि।


1
स्ट्रिंग "टैकोकैट" का उपयोग करें
जॉनपीजिंड

जवाबों:


2649

कैसा रहेगा:

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

यह स्लाइस सिंटैक्स विस्तारित है । यह काम करता है [begin:end:step]- शुरू और अंत छोड़ने और -1 के एक चरण को निर्दिष्ट करके, यह एक स्ट्रिंग को उलट देता है।


28
यह utf8 के लिए काम नहीं करता है .. हालांकि मुझे यह करने की ज़रूरत है b = a.decode('utf8')[::-1].encode('utf8')लेकिन सही दिशा के लिए धन्यवाद!
रिकी लेवी

13
@RickyLevi यदि .decode('utf8')आवश्यक हो, तो इसका मतलब aहै कि कोई स्ट्रिंग ऑब्जेक्ट नहीं है, बल्कि बाइट्स।
शिप्पू मोकादिम

255

@ पाओलो s[::-1]सबसे तेज है; एक धीमा दृष्टिकोण (शायद अधिक पठनीय है, लेकिन यह बहस का विषय है) ''.join(reversed(s))


13
यह लगभग 3 गुना धीमा है।
अपने

2
और यह कहने के लिए एक त्वरित टिप्पणी कि यह क्या करता है इस धीमे संस्करण का उपयोग करने से बेहतर समझा जाएगा!
tburrows13

4
यह धीमी है, क्योंकि join है सूची बनाने के लिए वैसे भी आकार पाने के लिए सक्षम होने के लिए। ''.join(list(reversed(s)))थोड़ा तेज हो सकता है।
जीन फ़्राँस्वा Fabre

क्या आपके पास कोई जानकारी है कि क्यों [:: - 1] सबसे तेज है? मैं गहरा गोता लगाना चाहता हूं।
टेनर

@ टैनर [:: - 1] सबसे तेज़ है क्योंकि यह किसी भी बाहरी फ़ंक्शन को कॉल नहीं करता है, बल्कि यह स्लाइसिंग का उपयोग कर रहा है, जो कि अजगर में अत्यधिक अनुकूलित है। '' .join (सूची (उलट))) 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'

लंबी व्याख्या

यदि आप अकादमिक प्रदर्शनी में रुचि रखते हैं, तो कृपया पढ़ते रहें।

पाइथन की स्ट्रे ऑब्जेक्ट में बिल्ट-इन रिवर्स फ़ंक्शन नहीं है।

यहाँ पायथन के तार के बारे में कुछ बातें हैं जो आपको जाननी चाहिए:

  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

CPython स्ट्रिंग संघनन का अनुकूलन करता है, जबकि अन्य कार्यान्वयन नहीं हो सकते हैं :

... CPYthon के कुशल कार्यान्वयन पर निर्भर नहीं करता है कि जगह में कथनों के लिए स्थान निर्धारण एक + = b या a = a + b के रूप में हो। यह अनुकूलन CPython में भी नाजुक है (यह केवल कुछ प्रकारों के लिए काम करता है) और कार्यान्वयन में बिल्कुल भी मौजूद नहीं है जो कि refcounting का उपयोग नहीं करते हैं। लाइब्रेरी के प्रदर्शन संवेदनशील भागों में, इसके बजाय '' .join () फॉर्म का उपयोग किया जाना चाहिए। यह सुनिश्चित करेगा कि विभिन्न क्रियान्वयन के दौरान रेखीय समय में संघनन होता है।


4
मुझे यह उत्तर पसंद है, अनुकूलन के बारे में स्पष्टीकरण, पठनीयता बनाम अनुकूलन, शिक्षक क्या चाहते हैं, इस पर सुझाव। मैं सबसे अच्छे अभ्यास खंड के बारे में निश्चित नहीं हूं, whileऔर सूचकांक को घटाकर, हालांकि शायद यह कम पठनीय है for i in range(len(a_string)-1, -1, -1): :। मुझे सबसे ज्यादा पसंद है कि आपके द्वारा चुने गए उदाहरण स्ट्रिंग एक ऐसा मामला है जहां आपको इसे उलटने की आवश्यकता नहीं होगी, और यह बताने में सक्षम नहीं होगा कि क्या आपके पास :)
दावोस

37

त्वरित उत्तर (TL; DR)

उदाहरण

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

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

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

विस्तृत जवाब

पृष्ठभूमि

यह उत्तर @odigity से निम्नलिखित चिंता का समाधान करने के लिए प्रदान किया गया है:

वाह। पाओलो द्वारा प्रस्तावित प्रस्ताव से मैं पहले तो बुरी तरह घबरा गया, लेकिन पहली ही टिप्पणी पढ़ने के बाद मुझे जो भय महसूस हुआ, उससे पीछे हट गया: "यह बहुत ही आकर्षक है। अच्छा काम!" मैं इतना परेशान हूं कि ऐसा उज्ज्वल समुदाय किसी ऐसी चीज के लिए इस तरह के गूढ़ तरीकों का उपयोग करने के बारे में सोचता है, इसलिए यह एक अच्छा विचार है। यह सिर्फ s.reverse () क्यों नहीं है?

मुसीबत

  • प्रसंग
    • अजगर 2.x
    • अजगर 3.x
  • परिदृश्य:
    • डेवलपर एक स्ट्रिंग को बदलना चाहता है
    • परिवर्तन सभी वर्णों के क्रम को उलट देना है

समाधान

नुकसान

  • डेवलपर कुछ इस तरह की उम्मीद कर सकता है string.reverse()
  • देशी मुहावरेदार (उर्फ " पायथोनिक ") समाधान नए डेवलपर्स के लिए पठनीय नहीं हो सकता है
  • डेवलपर को string.reverse()स्लाइस अंकन से बचने के लिए अपने स्वयं के संस्करण को लागू करने के लिए लुभाया जा सकता है।
  • टुकड़ा संकेतन का उत्पादन कुछ मामलों में प्रति-सहज हो सकता है:
    • उदाहरण देखें, example02
      • print 'coup_ate_grouping'[-4:] ## => 'ping'
      • की तुलना में
      • print 'coup_ate_grouping'[-4:-1] ## => 'pin'
      • की तुलना में
      • print 'coup_ate_grouping'[-1] ## => 'g'
    • इंडेक्सिंग के अलग-अलग परिणाम [-1]कुछ डेवलपर्स को फेंक सकते हैं

दलील

पायथन में एक विशेष परिस्थिति होती है जिससे अवगत होना: एक स्ट्रिंग एक चलने योग्य प्रकार है।

एक string.reverse()विधि को छोड़कर के लिए एक तर्क इस विशेष परिस्थिति की शक्ति का लाभ उठाने के लिए अजगर डेवलपर्स को प्रोत्साहन देना है।

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

यह समझने के लिए कि यह कैसे काम करता है, example02 की समीक्षा करना एक अच्छा अवलोकन प्रदान कर सकता है।

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'

निष्कर्ष

संज्ञानात्मक लोड कैसे समझ अजगर में टुकड़ा अंकन काम करता है वास्तव में कुछ ग्रहण करने वालों और डेवलपर्स भाषा सीखने में ज्यादा समय के लिए निवेश करने की इच्छा नहीं है जो के लिए बहुत अधिक हो सकता है के साथ जुड़े।

फिर भी, एक बार मूल सिद्धांतों को समझने के बाद, निश्चित स्ट्रिंग हेरफेर विधियों पर इस दृष्टिकोण की शक्ति काफी अनुकूल हो सकती है।

जो लोग अन्यथा सोचते हैं, उनके लिए वैकल्पिक दृष्टिकोण हैं, जैसे लैम्बडा फ़ंक्शंस, पुनरावृत्तियाँ, या सरल वन-ऑफ़ फ़ंक्शन घोषणाएँ।

यदि वांछित है, तो एक डेवलपर अपने स्वयं के string.reverse () विधि को लागू कर सकता है, हालांकि अजगर के इस पहलू के पीछे तर्क को समझना अच्छा है।

यह सभी देखें


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]) का समय सभी मामलों में सबसे कम (मेरी टाइपो को ठीक करने के बाद भी) है।

स्ट्रिंग उलट

यदि आप वास्तव में सामान्य अर्थों में एक स्ट्रिंग को उल्टा करना चाहते हैं, तो यह अधिक जटिल है। उदाहरण के लिए, निम्न स्ट्रिंग लें ( बाईं ओर इशारा करते हुए भूरे रंग की उंगली , पीली उंगली की ओर इशारा करते हुए )। वे दो अंगूर हैं, लेकिन 3 यूनिकोड कोड पॉइंट हैं। अतिरिक्त एक त्वचा संशोधक है

example = "👈🏾👆"

लेकिन अगर आप इसे दिए गए तरीकों में से किसी के साथ उलटते हैं, तो आपको भूरे रंग की उंगली की ओर इशारा मिलता है , पीले रंग की उंगली बाईं ओर इशारा करती है । इसका कारण यह है कि "ब्राउन" रंग संशोधक अभी भी बीच में है और इसके पहले जो कुछ भी है, उस पर लागू होता है। तो हमारे पास

  • U: उंगली की ओर इशारा करते हुए
  • एम: ब्राउन संशोधक
  • एल: उंगली बाईं ओर इशारा करते हुए

तथा

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

3. पुनरावृत्ति का उपयोग करना

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। Ex:rev_string("abcdef"*1000)
एडम पार्किन

9

यह देखने के लिए एक कम हैरान करने वाला तरीका होगा:

string = 'happy'
print(string)

'खुश'

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

'एपपाह'

अंग्रेजी में [-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

एक और 'विदेशी' तरीका है जो समर्थन करता है का उपयोग करके .reverse ()

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
मैंने upvote पर क्लिक किया, क्योंकि मुझे यह लंबोदर अभिव्यक्ति पसंद है। दुर्भाग्य से, यह ऊपर सूचीबद्ध सभी से कम से कम कुशल समाधान है (परीक्षण:
Gist

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

उपरोक्त सभी उपाय सही हैं, लेकिन अगर हम अजगर में लूप के लिए एक स्ट्रिंग को उल्टा करने की कोशिश कर रहे हैं, तो थोड़ा मुश्किल हो जाएगा, इसलिए यहां बताया गया है कि कैसे हम लूप का उपयोग करके स्ट्रिंग को उल्टा कर सकते हैं

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

OUTPUT:

o l l e h

-7

आप उल्टे फ़ंक्शन का उपयोग एक सूची समझने वाले के साथ कर सकते हैं। लेकिन मुझे समझ नहीं आ रहा है कि अजगर 3 में इस पद्धति को समाप्त क्यों किया गया, अनावश्यक रूप से।

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

सवाल एक स्ट्रिंग के रिवर्स के लिए पूछता है, और आप इसके बजाय एक सूची देते हैं ??
user21820

आपको .joinइसे मान्य उत्तर देने के लिए किसी चीज़ की आवश्यकता है
ऐशकेचम

1
Btw, [c for c in string]के लिए समान है list(string)
दाहिना पैर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.