क्या प्रत्येक स्ट्रिंग चरित्र को विभाजित करना संभव है?
उदाहरण के लिए, मान लें कि मेरे पास एक स्ट्रिंग है जिसमें निम्नलिखित हैं:
'1234567890'
मैं इसे इस तरह कैसे देख सकता हूं:
['12','34','56','78','90']
क्या प्रत्येक स्ट्रिंग चरित्र को विभाजित करना संभव है?
उदाहरण के लिए, मान लें कि मेरे पास एक स्ट्रिंग है जिसमें निम्नलिखित हैं:
'1234567890'
मैं इसे इस तरह कैसे देख सकता हूं:
['12','34','56','78','90']
जवाबों:
>>> line = '1234567890'
>>> n = 2
>>> [line[i:i+n] for i in range(0, len(line), n)]
['12', '34', '56', '78', '90']
बस पूरा होने के लिए, आप इसे regex के साथ कर सकते हैं:
>>> import re
>>> re.findall('..','1234567890')
['12', '34', '56', '78', '90']
विषम संख्या के लिए आप यह कर सकते हैं:
>>> import re
>>> re.findall('..?', '123456789')
['12', '34', '56', '78', '9']
आप निम्नलिखित कार्य भी कर सकते हैं, लंबे समय तक विखंडू को सरल बनाने के लिए:
>>> import re
>>> re.findall('.{1,2}', '123456789')
['12', '34', '56', '78', '9']
और आप उपयोग कर सकते हैं re.finditer
यदि स्ट्रिंग लंबे समय तक चंक द्वारा चंक उत्पन्न करने के लिए है।
'.'*n
इसे और अधिक स्पष्ट करने के लिए लिख सकता है । कोई ज्वाइनिंग, नो जिपिंग, नो लूप्स, नो लिस्ट कॉम्प्रिहेंशन; बस एक दूसरे के बगल में अगले दो वर्णों को ढूंढें, जो वास्तव में एक मानव मस्तिष्क इसके बारे में कैसे सोचता है। यदि मोंटी पाइथन अभी भी जीवित थे, तो वह इस विधि को पसंद करेंगे!
flags=re.S
।
इसके लिए पहले से ही अजगर में एक इनबिल्ट फ़ंक्शन है।
>>> from textwrap import wrap
>>> s = '1234567890'
>>> wrap(s, 2)
['12', '34', '56', '78', '90']
इसे डॉकस्ट्रिंग फॉर रैप कहते हैं:
>>> help(wrap)
'''
Help on function wrap in module textwrap:
wrap(text, width=70, **kwargs)
Wrap a single paragraph of text, returning a list of wrapped lines.
Reformat the single paragraph in 'text' so it fits in lines of no
more than 'width' columns, and return a list of wrapped lines. By
default, tabs in 'text' are expanded with string.expandtabs(), and
all other whitespace characters (including newline) are converted to
space. See TextWrapper class for available keyword args to customize
wrapping behaviour.
'''
wrap
यदि स्ट्रिंग में स्थान है, तो जो वापस मांगा गया है वह वापस नहीं किया जा सकता है। उदाहरण के लिए wrap('0 1 2 3 4 5', 2)
रिटर्न ['0', '1', '2', '3', '4', '5']
(तत्व छीन लिए गए)
एन-लंबाई समूहों में तत्वों को समूहीकृत करने का एक और सामान्य तरीका:
>>> s = '1234567890'
>>> map(''.join, zip(*[iter(s)]*2))
['12', '34', '56', '78', '90']
इस विधि के लिए डॉक्स से सीधे आता है zip()
।
zip(*[iter(s)]*2)
को समझने में मुश्किल होती है, तो पढ़िए कैसे zip(*[iter(s)]*n)
काम करता है पायथन? ।
>>> map(''.join, zip(*[iter('01234567')]*5))
->['01234']
zip()
साथ बदलें itertools.zip_longest()
:map(''.join, zip_longest(*[iter(s)]*2, fillvalue=''))
मुझे लगता है कि यह itertools संस्करण की तुलना में छोटा और अधिक पठनीय है:
def split_by_n(seq, n):
'''A generator to divide a sequence into chunks of n units.'''
while seq:
yield seq[:n]
seq = seq[n:]
print(list(split_by_n('1234567890', 2)))
PyPI से अधिक-इटर्टूल का उपयोग करना :
>>> from more_itertools import sliced
>>> list(sliced('1234567890', 2))
['12', '34', '56', '78', '90']
आप grouper()
नुस्खा का उपयोग कर सकते हैं itertools
:
from itertools import izip_longest
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *args)
from itertools import zip_longest
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return zip_longest(*args, fillvalue=fillvalue)
ये फ़ंक्शन मेमोरी-कुशल हैं और किसी भी पुनरावृत्तियों के साथ काम करते हैं।
निम्नलिखित कोड का प्रयास करें:
from itertools import islice
def split_every(n, iterable):
i = iter(iterable)
piece = list(islice(i, n))
while piece:
yield piece
piece = list(islice(i, n))
s = '1234567890'
print list(split_every(2, list(s)))
>>> from functools import reduce
>>> from operator import add
>>> from itertools import izip
>>> x = iter('1234567890')
>>> [reduce(add, tup) for tup in izip(x, x)]
['12', '34', '56', '78', '90']
>>> x = iter('1234567890')
>>> [reduce(add, tup) for tup in izip(x, x, x)]
['123', '456', '789']
इसे इस्तेमाल करे:
s='1234567890'
print([s[idx:idx+2] for idx,val in enumerate(s) if idx%2 == 0])
आउटपुट:
['12', '34', '56', '78', '90']
हमेशा की तरह, जो एक लाइनर्स से प्यार करते हैं
n = 2
line = "this is a line split into n characters"
line = [line[i * n:i * n+n] for i,blah in enumerate(line[::n])]
print(line)
मिलता है this is a line split into n characters
। क्या आप बेहतर डाल सकते हैं line = [line[i * n:i * n+n] for i,blah in enumerate(line[::n])]
:? इसे ठीक करें और यह एक अच्छा जवाब है :)।
,blah
और यह क्यों जरूरी है? मुझे लगता है कि मैं blah
किसी भी अल्फा चरित्र / एस के साथ बदल सकता हूं , लेकिन संख्या नहीं, और blah
/ या अल्पविराम को हटा नहीं सकता । मेरे संपादक का सुझाव है कि इसके बाद ,
enumerate
दो पुनरावृत्तियाँ लौटाता है, इसलिए आपको उन्हें लगाने के लिए दो स्थानों की आवश्यकता होती है। लेकिन आपको वास्तव में इस मामले में किसी भी चीज़ के लिए दूसरे पुनरावृत्ति की आवश्यकता नहीं है।
blah
मैं अंडरस्कोर या डबल अंडरस्कोर का उपयोग करना पसंद करता हूं, देखें: stackoverflow.com/questions/5893163/…
छोटी स्ट्रिंग के लिए एक सरल पुनरावर्ती समाधान:
def split(s, n):
if len(s) < n:
return []
else:
return [s[:n]] + split(s[n:], n)
print(split('1234567890', 2))
या ऐसे रूप में:
def split(s, n):
if len(s) < n:
return []
elif len(s) == n:
return [s]
else:
return split(s[:n], n) + split(s[n:], n)
, जो ठेठ विभाजन को दिखाता है और पुनरावर्ती दृष्टिकोण में पैटर्न को अधिक स्पष्ट रूप से जीतता है (हालांकि व्यावहारिक रूप से यह इस तरह से करना आवश्यक नहीं है)
more_itertools.sliced
पहले उल्लेख किया गया है । यहाँ more_itertools
पुस्तकालय से चार और विकल्प हैं :
s = "1234567890"
["".join(c) for c in mit.grouper(2, s)]
["".join(c) for c in mit.chunked(s, 2)]
["".join(c) for c in mit.windowed(s, 2, step=2)]
["".join(c) for c in mit.split_after(s, lambda x: int(x) % 2 == 0)]
बाद वाले विकल्पों में से प्रत्येक निम्नलिखित उत्पादन का उत्पादन करता है:
['12', '34', '56', '78', '90']
पर चर्चा की विकल्पों के लिए प्रलेखन: grouper
, chunked
, windowed
,split_after
यह लूप के लिए एक सरल द्वारा प्राप्त किया जा सकता है।
a = '1234567890a'
result = []
for i in range(0, len(a), 2):
result.append(a[i : i + 2])
print(result)
आउटपुट ऐसा लगता है जैसे ['12', '34', '56 ',' 78 ',' 90 ',' a ']