पायथन का उपयोग करके प्रत्येक वर्ण को एक स्ट्रिंग में बदलना


516

C ++ में, मैं std::stringइस तरह से इसे पुन : व्यवस्थित कर सकता हूं :

std::string str = "Hello World!";

for (int i = 0; i < str.length(); ++i)
{
    std::cout << str[i] << std::endl;
}

मैं पायथन में एक स्ट्रिंग पर कैसे पुनरावृति कर सकता हूं?

जवाबों:


441

जैसा कि जोहान्स ने बताया,

for c in "string":
    #do something with c

आप for loopनिर्माण का उपयोग करते हुए अजगर में बहुत कुछ कर सकते हैं ,

उदाहरण के लिए, open("file.txt")एक फ़ाइल ऑब्जेक्ट देता है (और फ़ाइल खोलता है), उस पर पुनरावृति उस फ़ाइल में लाइनों पर पुनरावृत्त करता है

with open(filename) as f:
    for line in f:
        # do something with line

यदि यह जादू की तरह लगता है, तो यह बहुत अच्छा है, लेकिन इसके पीछे का विचार वास्तव में सरल है।

वहाँ एक सरल पुनरावृत्ति प्रोटोकॉल है कि किसी भी तरह की वस्तु पर लागू किया जा सकता है ताकि उस पर forलूप काम कर सके।

बस एक पुनरावृत्ति लागू करने वाला जो एक next()विधि को परिभाषित करता है , और __iter__इसे पुनरावृत्त बनाने के लिए एक वर्ग पर एक विधि लागू करता है। ( __iter__बेशक, एक पुनरावृत्ति वस्तु लौटना चाहिए, वह यह है कि एक वस्तु जो परिभाषित करती है next())

आधिकारिक दस्तावेज देखें


14
एक नोट के रूप में, उलट पुनरावृत्ति को इसके साथ संग्रहीत किया गया है: सी के लिए उलट ("स्ट्रिंग")
अक्सेली पैलेन

दस्तावेज़ीकरण के किस भाग से आप जानते हैं कि एक स्ट्रिंग इट्रेटर प्रकार है?
विंकलार्र

dir () a string..you with See iter विशेषता।
छाया ०३५

312

यदि आपको स्ट्रिंग के माध्यम से पुनरावृति के रूप में सूचकांक तक पहुंच की आवश्यकता है, तो उपयोग करें enumerate():

>>> for i, c in enumerate('test'):
...     print i, c
... 
0 t
1 e
2 s
3 t

9
प्रो टिप: यह शून्य से शुरू होता है। आप एक से इसे शुरू करने की जरूरत है: 1 t, 2 e, 3 s, 4 t: पैरामीटर का उपयोग "शुरू"for i, c in enumerate('test', start=1)
Messa

90

और भी आसान:

for c in "test":
    print c

मैं पायथन में नौसिखिया हूं। किसी कारण से, यह मेरे वातावरण में संकलित नहीं होता है, और मुझे इसे काम करने के लिए कोष्ठक में ग लगाना पड़ा: for c in "test": print (c) क्यों?
मौरो वानेटी

7
@ मौरोवनीति यह लगभग निश्चित रूप से है क्योंकि आप पायथन 3 का उपयोग कर रहे हैं और जब मैंने इस सवाल का जवाब दिया तो AFAIK केवल पायथन 2 था।
जोहान्स वीस

37

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

i = 0
while i < len(str):
    print str[i]
    i += 1

लेकिन फिर फिर, क्यों जब तार स्वाभाविक रूप से चलने योग्य होते हैं?

for i in str:
    print i

6
अपने पहले के लूप के बजाय, आप कर सकते हैं: i for रेंज (len (str)) में: print (str [i]) जो कि मेरी राय में अपने दम पर काउंटर का प्रबंधन करने से बेहतर है। इससे भी बेहतर है marumog का उत्तर enumerate का उपयोग करना।
ऐहम

1
यह केवल इतने लंबे समय के लिए सी का उपयोग करने पर आधारित हो सकता है, लेकिन मैं लगभग हमेशा इस सी-ईश विधि का उपयोग करके समाप्त होता हूं। उदाहरण के लिए, मेरे पास कुछ 4-अंकीय संख्याओं वाली एक फाइल है, जिसके बारे में सभी 0. से शुरू करते हैं, इसलिए मुझे "0" खोजने और इसे और अगले 3 वर्णों को खोजने की आवश्यकता है, और यदि कोई हो तो नंबर की नकल किए बिना आगे बढ़ें। एक और 0 इसके बाद। "फॉर सी इन स्ट्र" या "आई फॉर सी" में से कोई नहीं, एन्यूमरेट (स्ट्र) में सी तरीके काम करते हैं क्योंकि मुझे इंडेक्स पर नियंत्रण की आवश्यकता है। मुझे यकीन है कि एक नियमित अभिव्यक्ति बहुत बेहतर होगी, हालांकि।
gkimsey

1
for i in range(len(...))बुराई है। अजगर 2.x में, range()एक सूची बनाता है, इसलिए बहुत लंबी लंबाई के लिए आप स्मृति के एक बहुत बड़े ब्लॉक को आवंटित कर सकते हैं। xrange()उन मामलों में बहुत कम से कम उपयोग करें । इसके अलावा, एक ही स्ट्रिंग के बार-बार अनुक्रमण सीधे स्ट्रिंग पर पुनरावृत्ति करने की तुलना में बहुत धीमा है। यदि आपको सूचकांक की आवश्यकता है, तो उपयोग करें enumerate()
akजक

6

वैसे आप भी इस तरह से कुछ दिलचस्प कर सकते हैं और लूप का उपयोग करके अपना काम कर सकते हैं

#suppose you have variable name
name = "Mr.Suryaa"
for index in range ( len ( name ) ):
    print ( name[index] ) #just like c and c++ 

जवाब है

श्री । स उिरया

हालाँकि, रेंज () उन मानों की एक सूची बनाती है जो अनुक्रम है इस प्रकार आप सीधे नाम का उपयोग कर सकते हैं

for e in name:
    print(e)

यह एक ही परिणाम भी उत्पन्न करता है और बेहतर भी दिखता है और सूची, ट्यूपल और शब्दकोश जैसे किसी भी अनुक्रम के साथ काम करता है।

हमने टो बिल्ट इन फंक्शन्स (बिफ्स इन पाइथन कम्युनिटी) का उपयोग किया है

1) रेंज () - रेंज () बीआईएफ इंडेक्स उदाहरण बनाने के लिए उपयोग किया जाता है

for i in range ( 5 ) :
can produce 0 , 1 , 2 , 3 , 4

2) लेन () - लेन () बीआईएफ का उपयोग दिए गए स्ट्रिंग की लंबाई का पता लगाने के लिए किया जाता है


4

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

एक स्ट्रिंग स्वाभाविक रूप से वर्णों की एक सूची है, इसलिए 'मैप' स्ट्रिंग के ऊपर से पुनरावृति करेगा - दूसरे तर्क के रूप में - फ़ंक्शन को लागू करना - पहला तर्क - प्रत्येक को।

उदाहरण के लिए, यहां मैं एक साधारण लंबोदर दृष्टिकोण का उपयोग करता हूं, क्योंकि मैं जो करना चाहता हूं वह चरित्र का एक मामूली संशोधन है: यहां, प्रत्येक वर्ण मान को बढ़ाने के लिए:

>>> ''.join(map(lambda x: chr(ord(x)+1), "HAL"))
'IBM'

या अधिक आम तौर पर:

>>> ''.join(map(my_function, my_string))

जहाँ my_function एक char value लेता है और char value वापस करता है।


2

कई उत्तर यहां उपयोग करते हैं rangexrangeआम तौर पर बेहतर है क्योंकि यह पूरी तरह से त्वरित सूची के बजाय एक जनरेटर लौटाता है। जहां मेमोरी और या व्यापक रूप से भिन्न लंबाई की पुनरावृत्तियाँ एक मुद्दा हो सकती हैं, xrangeश्रेष्ठ है।


1
ध्यान दें कि यह केवल पायथन 2 पर लागू होता है, जो उम्मीद है कि अब सिकुड़ अल्पसंख्यक है
सैम मेसन

0

यदि आप कभी भी ऐसी स्थिति में दौड़ते हैं, जहाँ आपको आवश्यकता है get the next char of the word using __next__(), तो उस पर एक string_iteratorऔर पुनरावृति बनाना याद रखें और न किoriginal string (it does not have the __next__() method)

इस उदाहरण में, जब मुझे कोई चार्ट मिलता है = [मैं अगले शब्द ]को देखता रहता हूं, जब मुझे नहीं मिलता है , इसलिए मुझे __ne_T_T का उपयोग करना होगा

यहाँ स्ट्रिंग पर लूप के लिए मदद नहीं करेगा

myString = "'string' 4 '['RP0', 'LC0']' '[3, 4]' '[3, '4']'"
processedInput = ""
word_iterator = myString.__iter__()
for idx, char in enumerate(word_iterator):
    if char == "'":
        continue

    processedInput+=char

    if char == '[':
        next_char=word_iterator.__next__()
        while(next_char != "]"):
          processedInput+=next_char
          next_char=word_iterator.__next__()
        else:
          processedInput+=next_char
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.