প্রতি নবম চরিত্রটিতে কি কোনও স্ট্রিং বিভক্ত করা সম্ভব?
উদাহরণস্বরূপ, ধরুন আমার কাছে একটি স্ট্রিং রয়েছে যাতে নিম্নলিখিতটি রয়েছে:
'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']
কেবলমাত্র সম্পূর্ণ হওয়ার জন্য, আপনি এটি একটি রেজেক্সের সাহায্যে করতে পারেন:
>>> 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()
।
>>> map(''.join, zip(*[iter('01234567')]*5))
->['01234']
zip()
সঙ্গে itertools.zip_longest()
:map(''.join, zip_longest(*[iter(s)]*2, fillvalue=''))
আমি মনে করি এটি তাত্ক্ষণিক সংস্করণের চেয়ে সংক্ষিপ্ত এবং আরও পঠনযোগ্য:
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)))
পিপিআই থেকে আরও-এরর্টুলগুলি ব্যবহার করা :
>>> 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)))
yield ''.join(piece)
এটি প্রত্যাশা অনুযায়ী কাজ করতে হবে: eval.in/813878
>>> 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
/ এবং কমাটি সরাতে পারি না । আমার সম্পাদকটি পরে হোয়াইটস্পেস যুক্ত করার পরামর্শ দিচ্ছেন ,
: s
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)
, যা পুনরাবৃত্তিমূলক পদ্ধতির সাধারণ স্পষ্টতাকে এবং বিজয়িত প্যাটার্নটিকে আরও স্পষ্টভাবে চিত্রিত করে (যদিও বাস্তবে এটি এটি করার প্রয়োজন হয় না)
আমি একই পরিস্থিতিতে জড়িত ছিল।
এটি আমার পক্ষে কাজ করেছে
x="1234567890"
n=2
list=[]
for i in range(0,len(x),n):
list.append(x[i:i+n])
print(list)
আউটপুট
['12', '34', '56', '78', '90']
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', 'এ'] এর মতো দেখাচ্ছে