पाइथन में कॉमा और स्ट्रिप व्हाट्सएप द्वारा विभाजित


346

मेरे पास कुछ अजगर कोड है जो अल्पविराम पर विभाजित करता है, लेकिन व्हॉट्सएप को नहीं छीनता है:

>>> string = "blah, lots  ,  of ,  spaces, here "
>>> mylist = string.split(',')
>>> print mylist
['blah', ' lots  ', '  of ', '  spaces', ' here ']

मैं इस तरह से हटाए गए व्हाट्सएप को समाप्त करना चाहता हूं:

['blah', 'lots', 'of', 'spaces', 'here']

मुझे पता है कि मैं सूची और पट्टी के माध्यम से लूप कर सकता हूं () प्रत्येक आइटम लेकिन, जैसा कि यह पायथन है, मैं अनुमान लगा रहा हूं कि यह करने का एक तेज, आसान और अधिक सुरुचिपूर्ण तरीका है।

जवाबों:


594

सूची समझ का उपयोग करें - सरल, और बस एक forलूप के रूप में पढ़ना आसान है ।

my_string = "blah, lots  ,  of ,  spaces, here "
result = [x.strip() for x in my_string.split(',')]
# result is ["blah", "lots", "of", "spaces", "here"]

देखें: सूची समझ पर अजगर डॉक्स सूची समझ की
एक अच्छी 2 दूसरी व्याख्या।


1
बहुत अच्छा! मैंने रिक्त सूची प्रविष्टियों से छुटकारा पाने के लिए निम्नानुसार एक आइटम जोड़ा। > text = [x.strip () के लिए x में text.split ('।') अगर x! = '']
RandallShanePhD

@ सीन: अमान्य / अधूरा अजगर कोड आपके "पोस्ट के मूल इरादे" था? रिव्यू वैंकर्स के अनुसार यह था: stackoverflow.com/review/suggested-edits/21504253 । क्या आप उन्हें गलत बताकर अन्यथा सुधार कर सकते हैं यदि वे गलत हैं (फिर से)?
फोरेज

मूल को एक REPL से कॉपी-पेस्ट किया गया था (यदि मुझे सही याद है) और लक्ष्य अंतर्निहित अवधारणा को समझ रहा था (किसी ऑपरेशन को करने के लिए सूची समझ का उपयोग कर) - लेकिन आप सही हैं, यह अधिक समझ में आता है अगर आप उस सूची को देखते हैं। एक नई सूची तैयार करता है।
सीन विएरा

24

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

>>> import re
>>> string = "  blah, lots  ,  of ,  spaces, here "
>>> pattern = re.compile("^\s+|\s*,\s*|\s+$")
>>> print([x for x in pattern.split(string) if x])
['blah', 'lots', 'of', 'spaces', 'here']

^\s+मिलान नहीं होने पर भी यह काम करता है:

>>> string = "foo,   bar  "
>>> print([x for x in pattern.split(string) if x])
['foo', 'bar']
>>>

यहाँ आपको ^ \ _ + की आवश्यकता क्यों है:

>>> pattern = re.compile("\s*,\s*|\s+$")
>>> print([x for x in pattern.split(string) if x])
['  blah', 'lots', 'of', 'spaces', 'here']

ब्लाह में अग्रणी स्थान देखें?

स्पष्टीकरण: ऊपर पायथन 3 दुभाषिया का उपयोग करता है, लेकिन परिणाम पायथन 2 में समान हैं।


8
मेरा मानना [x.strip() for x in my_string.split(',')]है कि पूछे गए प्रश्न के लिए अधिक पायथोनिक है। शायद ऐसे मामले हैं जहां मेरा समाधान आवश्यक है। यदि मैं एक के पार चला जाता हूं तो मैं इस सामग्री को अपडेट करूंगा।
tbc0

क्यों ^\s+जरूरी है? मैंने इसके बिना आपके कोड का परीक्षण किया है और यह काम नहीं करता है, लेकिन मुझे नहीं पता कि क्यों।
laike9m

अगर मैं उपयोग करता हूं re.compile("^\s*,\s*$"), तो परिणाम है [' blah, lots , of , spaces, here ']
laike9m

@ laike9m, मैंने आपको अंतर दिखाने के लिए अपना उत्तर अपडेट किया। ^\s+बनाता है। जैसा कि आप अपने लिए देख सकते हैं, ^\s*,\s*$वांछित परिणाम नहीं लौटाते हैं। इसलिए यदि आप एक रेगेक्सपी के साथ विभाजन चाहते हैं, तो उपयोग करें ^\s+|\s*,\s*|\s+$
tbc0

पहला मैच खाली है अगर प्रमुख पैटर्न (^ \ s +) मेल नहीं खाता है तो आपको स्ट्रिंग "फू, बार" के लिए ['', 'फू', 'बार'] जैसा कुछ मिलता है।
स्टेव मैककॉले

21

मैं जोड़ने आया था:

map(str.strip, string.split(','))

लेकिन यह पहले से ही एक टिप्पणी में जेसन ऑरेन्डोर्फ द्वारा उल्लेख किया गया था देखा ।

एक ही जवाब में ग्लेन मेनार्ड की टिप्पणी को पढ़ते हुए मानचित्र पर सूची की समझ का सुझाव मुझे आश्चर्यचकित करने लगा कि क्यों। मैंने माना कि वह प्रदर्शन के कारणों के लिए है, लेकिन निश्चित रूप से वह शैलीगत कारणों से, या कुछ और (ग्लेन) के लिए हो सकता है।

तो मेरे बॉक्स में एक त्वरित (संभवतः त्रुटिपूर्ण?) परीक्षण तीन तरीकों को लागू करने वाले लूप में पता चला:

[word.strip() for word in string.split(',')]
$ time ./list_comprehension.py 
real    0m22.876s

map(lambda s: s.strip(), string.split(','))
$ time ./map_with_lambda.py 
real    0m25.736s

map(str.strip, string.split(','))
$ time ./map_with_str.strip.py 
real    0m19.428s

निर्माण map(str.strip, string.split(',')) , विजेता हालांकि ऐसा लगता है कि वे एक ही बॉलपार्क में सभी कर रहे हैं।

निश्चित रूप से हालांकि मानचित्र (एक लंबो के साथ या बिना) जरूरी नहीं कि प्रदर्शन के कारणों से इनकार किया जाना चाहिए, और मेरे लिए यह कम से कम एक सूची समझ के रूप में स्पष्ट है।

संपादित करें:

उबंटू 10.04 पर पायथन 2.6.5


15

विभाजन से पहले सफेद स्थान को स्ट्रिंग से हटा दें।

mylist = my_string.replace(' ','').split(',')

10
एक समस्या की तरह यदि अल्पविराम द्वारा अलग किए गए आइटम में एम्बेडेड स्थान होते हैं, जैसे "you just, broke this"
रॉबर्ट रोसनी

1
गीज़, इसके लिए एक -1। आप लोग कठिन हैं। इसने उनकी समस्या को हल कर दिया, उनका नमूना डेटा प्रदान करना केवल एकल शब्द था और कोई विनिर्देश नहीं था कि डेटा वाक्यांश होगा। लेकिन w / e, मुझे लगता है कि आप लोग कैसे इधर-उधर लुढ़कते हैं।
1548 बजे user489041

वैसे भी धन्यवाद, उपयोगकर्ता। हालांकि निष्पक्ष होने के लिए मैंने विशेष रूप से विभाजन के लिए कहा और फिर पट्टी () और पट्टी प्रमुख और अनुगामी व्हाट्सएप को हटा देता है और बीच में कुछ भी नहीं छूता है। थोड़ा सा बदलाव और आपका जवाब पूरी तरह से काम करेगा, हालांकि: mylist = mystring.strip ()। विभाजन (',') हालांकि मुझे नहीं पता कि यह विशेष रूप से कुशल है।
Mr_Chimp

12

मुझे पता है कि यह पहले ही उत्तर दिया जा चुका है, लेकिन यदि आप इसे बहुत कुछ कर रहे हैं, तो नियमित अभिव्यक्ति एक बेहतर तरीका हो सकता है:

>>> import re
>>> re.sub(r'\s', '', string).split(',')
['blah', 'lots', 'of', 'spaces', 'here']

\sकिसी भी खाली स्थान के चरित्र से मेल खाता है, और हम सिर्फ एक खाली स्ट्रिंग के साथ बदलना ''। आप अधिक जानकारी यहां पा सकते हैं: http://docs.python.org/library/re.html#re.sub


3
आपका उदाहरण रिक्त स्थान वाले तारों पर काम नहीं करेगा। "उदाहरण के लिए, यह एक" के लिए "," उदाहरणार्थ "," एक "बन जाएगा। यह कहते हुए कि यह बीएडी समाधान नहीं है (यह मेरे उदाहरण पर पूरी तरह से काम करता है) यह सिर्फ हाथ में काम पर निर्भर करता है!
Mr_Chimp

हाँ, यह बहुत सही है! आप शायद regexp को समायोजित कर सकते हैं ताकि यह रिक्त स्थान के साथ तारों को संभाल सके, लेकिन यदि सूची समझ में आता है, तो मैं इसके साथ रहना चाहूंगा;)
ब्रैड मॉन्टगोमेरी

2
import re
result=[x for x in re.split(',| ',your_string) if x!='']

यह मेरे लिए ठीक काम करता है।


2

re (नियमित अभिव्यक्ति के रूप में) एक ही बार में कई वर्णों में विभाजन की अनुमति देता है:

$ string = "blah, lots  ,  of ,  spaces, here "
$ re.split(', ',string)
['blah', 'lots  ', ' of ', ' spaces', 'here ']

यह आपके उदाहरण स्ट्रिंग के लिए अच्छी तरह से काम नहीं करता है, लेकिन अल्पविराम से अलग की गई सूची के लिए अच्छी तरह से काम करता है। अपने उदाहरण स्ट्रिंग के लिए, आप "विभाजन-पर-इस- या- " प्रभाव प्राप्त करने के लिए regex पैटर्न पर विभाजित करने के लिए re.split पावर को जोड़ सकते हैं ।

$ re.split('[, ]',string)
['blah',
 '',
 'lots',
 '',
 '',
 '',
 '',
 'of',
 '',
 '',
 '',
 'spaces',
 '',
 'here',
 '']

दुर्भाग्य से, यह बदसूरत है, लेकिन एक filterचाल है:

$ filter(None, re.split('[, ]',string))
['blah', 'lots', 'of', 'spaces', 'here']

देखा!


2
सिर्फ क्यों नहीं re.split(' *, *', string)?
पॉल टॉम्बलिन

4
@PaulTomblin अच्छा विचार है। एक भी किया जा सकता है: re.split('[, ]*',string)एक ही प्रभाव के लिए।
डेन्विड

Dannid मुझे यह लिखने के बाद एहसास हुआ कि यह शुरुआत में व्हाट्सएप को स्ट्रिप नहीं करता है और @ tbc0 का जवाब पसंद करता है।
पॉल टॉम्बलिन

@PaulTomblinheh, और मेरा खंडन [, ]*सूची के अंत में एक खाली स्ट्रिंग छोड़ देता है। मुझे लगता है कि फिल्टर अभी भी वहाँ फेंकने के लिए एक अच्छी बात है, या शीर्ष उत्तर की तरह समझ की सूची बनाने के लिए छड़ी।
21

1

map(lambda s: s.strip(), mylist)स्पष्ट रूप से लूपिंग से थोड़ा बेहतर होगा। या एक ही बार में पूरी बात के लिए:map(lambda s:s.strip(), string.split(','))


10
युक्ति: किसी भी समय आप अपने आप को उपयोग करते हुए पाते हैं map, विशेष रूप से यदि आप lambdaइसके साथ उपयोग कर रहे हैं, तो यह देखने के लिए डबल-चेक करें कि क्या आपको सूची समझ का उपयोग करना चाहिए।
ग्लेन मेनार्ड

11
आप लैम्बडा से बच सकते हैं map(str.strip, s.split(','))
जेसन ओरेंडोर्फ


1
import re
mylist = [x for x in re.compile('\s*[,|\s+]\s*').split(string)]

बस, अल्पविराम या कम से कम एक सफेद रिक्त स्थान के साथ / पूर्ववर्ती / सफल सफेद रिक्त स्थान के बिना।

प्रयास करें!


0

map(lambda s: s.strip(), mylist)स्पष्ट रूप से लूपिंग से थोड़ा बेहतर होगा।
या एक ही बार में पूरी बात के लिए:

map(lambda s:s.strip(), string.split(','))

यह मूल रूप से आपकी जरूरत की हर चीज है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.