वर्णों की सरणी में स्ट्रिंग को कैसे विभाजित किया जाए?


450

मैंने एक स्ट्रिंग को वर्णों में विभाजित करने के उत्तर के लिए वेब के चारों ओर देखने की कोशिश की है, लेकिन मुझे एक सरल विधि नहीं मिल सकती है

str.split(//)लगता है रूबी काम नहीं करती। क्या लूपिंग के बिना ऐसा करने का एक सरल तरीका है?


12
पायथन में, स्ट्रिंग्स पहले से ही प्रतिस्थापन को छोड़कर सभी उद्देश्यों के लिए वर्णों के सरणियों हैं। आप उन्हें स्लाइस कर सकते हैं, संदर्भ दे सकते हैं या सूचकांक द्वारा आइटम देख सकते हैं, आदि
dansalmo

जवाबों:


860
>>> s = "foobar"
>>> list(s)
['f', 'o', 'o', 'b', 'a', 'r']

आपको सूची चाहिए


2
माणिक विधि की तुलना में मेरी राय में, आप सी प्रकार के अनुक्रम प्रकारों के बीच स्वतंत्र रूप से, और भी बेहतर रूप में परिवर्तित कर सकते हैं।
arthurprs

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

मैं ऐसा करने के लिए यहां झंडा चाहता हूं ... लेकिन वैसे भी यदि आप चाहते हैं कि आप इस व्यवहार से बच सकते हैं, तो यह प्रयोग करके बच सकते हैंcast_method = lambda x: [x]
Madzohan


60

आप इसे बिना सूची के भी बहुत सरल तरीके से कर सकते हैं ():

>>> [c for c in "foobar"]
['f', 'o', 'o', 'b', 'a', 'r']

4
Stackoverflow में आपका स्वागत है। क्या आप इस समस्या को हल करने के तरीके के बारे में बताने के लिए उत्तर को थोड़ा विस्तार देंगे।
NJInamdar

21
यह एक मात्र है for, समझाने के लिए बहुत कुछ नहीं है। मुझे लगता है कि आपको डेटा संरचनाओं पर अजगर ट्यूटोरियल पढ़ना चाहिए , विशेष रूप से सूची समझ।
WhyNotHugo

4
यह सिर्फ मतलब है list(map(lambda c: c, iter("foobar"))), लेकिन अधिक पठनीय और सार्थक है।
no1xsyzy

41

यदि आप एक बार में अपने स्ट्रिंग एक चरित्र को संसाधित करना चाहते हैं। आपके पास विभिन्न विकल्प हैं।

uhello = u'Hello\u0020World'

सूची समझ का उपयोग करना:

print([x for x in uhello])

आउटपुट:

['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']

मानचित्र का उपयोग करना:

print(list(map(lambda c2: c2, uhello)))

आउटपुट:

['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']

निर्मित में सूची समारोह:

print(list(uhello))

आउटपुट:

['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']

लूप के लिए उपयोग करना:

for c in uhello:
    print(c)

आउटपुट:

H
e
l
l
o

W
o
r
l
d

क्या इन विधियों में से प्रत्येक की प्रदर्शन विशेषताओं में अंतर है?
qxzsilver

20

मैंने इस कार्य को पूरा करने के लिए दो और तरीके खोजे। यह किसी के लिए मददगार हो सकता है।

पहला आसान है:

In [25]: a = []
In [26]: s = 'foobar'
In [27]: a += s
In [28]: a
Out[28]: ['f', 'o', 'o', 'b', 'a', 'r']

और दूसरा एक उपयोग mapऔर lambdaफ़ंक्शन। यह अधिक जटिल कार्यों के लिए उपयुक्त हो सकता है:

In [36]: s = 'foobar12'
In [37]: a = map(lambda c: c, s)
In [38]: a
Out[38]: ['f', 'o', 'o', 'b', 'a', 'r', '1', '2']

उदाहरण के लिए

# isdigit, isspace or another facilities such as regexp may be used
In [40]: a = map(lambda c: c if c.isalpha() else '', s)
In [41]: a
Out[41]: ['f', 'o', 'o', 'b', 'a', 'r', '', '']

अधिक तरीकों के लिए अजगर डॉक्स देखें


पहला तरीका बहुत सरल है। क्या ऐसे कारण हैं कि लोग कुछ और जटिल चाहते हैं?
28’18

नमस्कार! पहला विकल्प वास्तव में सरल है। दूसरा, हालांकि, अधिक जटिल प्रसंस्करण से निपटने की बेहतर क्षमता है।
एलेक्सी मिलोग्रादोव

19

कार्य स्ट्रिंग के पात्रों पर पुनरावृत्ति करने और उन्हें एक सूची में इकट्ठा करने के लिए उबालता है। सबसे भोला समाधान दिखेगा

result = []
for character in string:
    result.append(character)

बेशक, इसे छोटा किया जा सकता है

result = [character for character in string]

लेकिन अभी भी छोटे समाधान हैं जो एक ही काम करते हैं।

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

>>> list('abc')
['a', 'b', 'c']

बड़ा प्लस यह है कि यह पायथन 2 और पायथन 3 दोनों में समान काम करता है।

इसके अलावा, पायथन 3.5 से शुरू (भयानक PEP 448 के लिए धन्यवाद ) अब किसी भी पुनरावृत्ति से खाली सूची को शाब्दिक रूप से खोलकर सूची बनाना संभव है:

>>> [*'abc']
['a', 'b', 'c']

यह neater है, और कुछ मामलों में listसीधे कंस्ट्रक्टर को कॉल करने की तुलना में अधिक कुशल है ।

मैं का उपयोग कर के खिलाफ सलाह देंगे map, आधारित दृष्टिकोण क्योंकि mapहै नहीं पायथन 3. देखें में एक सूची प्रदान उपयोग फिल्टर, नक्शे कैसे, और अजगर 3 में कम हो


मुझे लगता है कि अंतिम प्रस्ताव बहुत अच्छा है। लेकिन मैं नहीं देखता कि आपने कुछ अन्य दृष्टिकोणों पर दोबारा गौर क्यों किया, (उनमें से अधिकांश) पहले से ही यहां पोस्ट किए गए हैं और अद्भुत अजगर 3.5 समाधान से विचलित हैं!
MSeifert

14

मुझे सिर्फ चार वर्णों की आवश्यकता है:

arr = list(str)

यदि आप str को किसी विशेष str से विभाजित करना चाहते हैं:

# str = "temp//temps" will will be ['temp', 'temps']
arr = str.split("//")

12

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

मान लीजिए,

a = "bottle"
a.split() // will only return the word but not split the every single char.

a = "bottle"
list(a) // will separate ['b','o','t','t','l','e']


3

यदि आप केवल स्ट्रिंग तक पहुंच पढ़ना चाहते हैं, तो आप सीधे सरणी संकेतन का उपयोग कर सकते हैं।

Python 2.7.6 (default, Mar 22 2014, 22:59:38) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> t = 'my string'
>>> t[1]
'y'

Regexp का उपयोग किए बिना परीक्षण के लिए उपयोगी हो सकता है। क्या स्ट्रिंग में एक समाप्त होने वाली न्यूलाइन है?

>>> t[-1] == '\n'
False
>>> t = 'my string\n'
>>> t[-1] == '\n'
True

1

खैर, जितना मैं सूची (ओं) के संस्करण को पसंद करता हूं, यहां एक और क्रिया तरीका मुझे मिला (लेकिन यह अच्छा है इसलिए मैंने सोचा कि मैं इसे मैदान में जोड़ दूंगा):

>>> text = "My hovercraft is full of eels"
>>> [text[i] for i in range(len(text))]
['M', 'y', ' ', 'h', 'o', 'v', 'e', 'r', 'c', 'r', 'a', 'f', 't', ' ', 'i', 's', ' ', 'f', 'u', 'l', 'l', ' ', 'o', 'f', ' ', 'e', 'e', 'l', 's']

camelcase = ''.join([text[i].upper() if i % 2 else text[i].lower() for i in range(len(text))])
व्हिसलेलेक्स

1
from itertools import chain

string = 'your string'
chain(string)

इसी तरह list(string)लेकिन एक जनरेटर लौटाता है जिसका उपयोग के बिंदु पर आलसी मूल्यांकन किया जाता है, इसलिए स्मृति कुशल होती है।


यकीन नहीं है कि जहां यह स्ट्रिंग से अधिक उपयोगी होगा, जो कि चलने योग्य है।
Ry-

0
>>> for i in range(len(a)):
...     print a[i]
... 

जहां एक स्ट्रिंग है जिसे आप अलग करना चाहते हैं। मान "एक [i]" स्ट्रिंग के व्यक्तिगत चरित्र हैं जिन्हें एक सूची में जोड़ा जा सकता है।


1
for c in a: print cअधिक प्रत्यक्ष है
जेम्स वाल्डबी - jwpat7
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.