প্রতি নবম চরিত্রে বিভক্ত স্ট্রিং?


379

প্রতি নবম চরিত্রটিতে কি কোনও স্ট্রিং বিভক্ত করা সম্ভব?

উদাহরণস্বরূপ, ধরুন আমার কাছে একটি স্ট্রিং রয়েছে যাতে নিম্নলিখিতটি রয়েছে:

'1234567890'

আমি এটির মতো দেখতে এটি কীভাবে পেতে পারি:

['12','34','56','78','90']

উত্তর:


548
>>> line = '1234567890'
>>> n = 2
>>> [line[i:i+n] for i in range(0, len(line), n)]
['12', '34', '56', '78', '90']

35
এটি সত্যিই দুর্দান্ত উত্তর কারণ এটি কোনওভাবেই সংশ্লেষিত হয়নি এবং এই সত্যটি আপনাকে তার সরলতার কারণে পদ্ধতিটি সহজেই মনে করতে দেয়
ট্রেভর রুডলফ

1
@ ট্রেভররুডল্ফ এটি যা বলবে তা ঠিক তাই করে। উপরের উত্তরটি সত্যই কেবল লুপের জন্য তবে অজগরিকভাবে প্রকাশিত। এছাড়াও, যদি আপনার একটি "সরলবাদী" উত্তর মনে রাখার প্রয়োজন হয় তবে তাদের মনে রাখার জন্য কমপক্ষে কয়েক হাজার উপায় রয়েছে: স্ট্যাকওভারফ্লোতে পৃষ্ঠাটি চিহ্নিত করা; অনুলিপি করা এবং তারপরে একটি ইমেলে আটকানো; আপনি মনে রাখতে চান এমন জিনিসগুলির সাথে একটি "সহায়ক" ফাইল রাখা; যখনই আপনার কোনও কিছুর প্রয়োজন হবে কেবলমাত্র আধুনিক সার্চ ইঞ্জিন ব্যবহার করুন; প্রতিটি ওয়েব ব্রাউজারে (সম্ভবত) বুকমার্ক ব্যবহার করে; ইত্যাদি
dylnmc

1
দ্বিতীয় যদিও, এটি প্রদর্শিত হবে যেন আপনি হয় গুরুতর। আমি আসলে আশা করি আপনি গুরুতর তাই যেহেতু এটি সত্যিকার অর্থে সংশ্লেষিত নয়
dylnmc

1
আমি গুরুতর হয়ে উঠছিলাম, আমি এই কোডটি আমার বাইনারি রূপান্তরকারীটিতে একটি এমুলেটরটিতে ব্যবহার করেছি, আমি পছন্দ করেছি যে এটি লুপ হা হা হা হা হা হা হা হা হা করার জন্য একটি পাইথোনিক ছিল তবে আরও পদ্ধতি ভেঙে দেওয়ার জন্য ধন্যবাদ কেন আমি পদ্ধতিটি উপভোগ করছি!
ট্রেভর রুডল্ফ

5
হাস্যকরভাবে, শব্দের এমনভাবে ব্যবহার করার চেষ্টা করা হবে যার গোপন অর্থ থাকবে না, প্রায়শই বিশৃঙ্খলাযুক্ত বাক্য হতে পারে।
deed02392

206

কেবলমাত্র সম্পূর্ণ হওয়ার জন্য, আপনি এটি একটি রেজেক্সের সাহায্যে করতে পারেন:

>>> 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যদি স্ট্রিংটি অংশ দ্বারা অংশ তৈরি করতে দীর্ঘ হয় তবে আপনি ব্যবহার করতে পারেন ।


3
এটি এখানকার সেরা উত্তর এবং শীর্ষে থাকার যোগ্য। আবার এও লিখতে পারে '.'*nএটা আরো স্পষ্ট করা। যোগদান না, কোনও জিপিং, কোনও লুপ, কোনও তালিকা উপলব্ধি নয়; একে অপরের পাশে পরের দুটি অক্ষর সন্ধান করুন, যা মানুষের মস্তিষ্ক সম্পর্কে ঠিক এভাবেই চিন্তা করে। মন্টি পাইথন এখনও বেঁচে থাকলে তিনি এই পদ্ধতিটি পছন্দ করতেন!
jdk1.0

যুক্তিসঙ্গত দীর্ঘ স্ট্রিংয়ের জন্য এটিও দ্রুততম পদ্ধতি: gitlab.com/snippets/1908857
রাল্ফ বোল্টন

স্ট্রিংয়ে নতুন লাইন থাকলে এটি কাজ করবে না। এই প্রয়োজন flags=re.S
অরণ-ফে

আহ্ .... রেজেক্স .... আমি কেন এই
এক্সডিটি

145

এর জন্য পাইথনে ইতিমধ্যে একটি ইনবিল্ট ফাংশন রয়েছে।

>>> 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.
'''

2
মুদ্রণ (মোড়ক ('12345678', 3)) স্ট্রিংটিকে 3 টি সংখ্যার গ্রুপে বিভক্ত করে, তবে সামনে এবং পেছনে শুরু হয় না। ফলাফল: ['123', '456', '78']
আটলান্টোর

2
'মোড়ানো' সম্পর্কে জেনে রাখা আকর্ষণীয় তবে এটি উপরে যা জিজ্ঞাসা করা হয়েছিল ঠিক তা করছে না। এটি নির্দিষ্ট সংখ্যক অক্ষরগুলিতে একটি স্ট্রিংকে বিভক্ত করার পরিবর্তে পাঠ্য প্রদর্শন করার দিকে আরও বেশি আলোকিত।
ওরেনে

2
wrapস্ট্রিংয়ের স্থান রয়েছে কিনা তা জানতে চাওয়া হবে না। উদাহরণস্বরূপ wrap('0 1 2 3 4 5', 2)রিটার্ন ['0', '1', '2', '3', '4', '5'](উপাদানগুলি
ছিটিয়ে দেওয়া হয়

3
এটি প্রকৃতপক্ষে প্রশ্নের জবাব দেয়, তবে স্থানগুলি থাকে এবং আপনি সেগুলি বিভক্ত অক্ষরগুলিতে বজায় রাখতে চান তবে কি হবে? মোড়ক () ফাঁকা স্থানগুলি সরিয়ে দেয় যদি তারা অক্ষরগুলির একটি বিভক্ত গোষ্ঠীর পরে সরাসরি পড়ে যায়
আয়রন অ্যাটর্নি

1
হাইফেনের সাহায্যে পাঠ্যকে বিভক্ত করতে চাইলে এটি খারাপভাবে কাজ করে (আপনি যুক্তি হিসাবে যে সংখ্যাটি দিয়েছেন তা হ'ল অক্ষরের সংখ্যার সংখ্যা হুবহু এক নয়, এবং এটি হিফেন এবং সাদা স্পেসে ভেঙে যায়)।
মিঃ ভোকাবুলারি

79

উপাদানগুলি এন-দৈর্ঘ্যের গ্রুপগুলিতে গ্রুপ করার আরও একটি সাধারণ উপায়:

>>> s = '1234567890'
>>> map(''.join, zip(*[iter(s)]*2))
['12', '34', '56', '78', '90']

এই পদ্ধতিটি ডক্স থেকে সরাসরি আসে zip()


2
[19]: এ = "হ্যালো ওয়ার্ল্ড"; তালিকা (মানচিত্র (""। জয়েন, জিপ (* [ইটার (ক)] * ৪))) ফলাফল পান ['নরক', 'ও হো'] get
truease.com

16
যদি কেউ বুঝতে zip(*[iter(s)]*2)অসুবিধে হয় তবে পড়ুন পাইথনে কীভাবে zip(*[iter(s)]*n)কাজ করে?
গ্রিজেশ চৌহান

15
এটি অদ্ভুত অক্ষরের জন্য অ্যাকাউন্ট করে না, এটি কেবল এই অক্ষরগুলি ফেলে দেবে: >>> map(''.join, zip(*[iter('01234567')]*5))->['01234']
বিজোর্ন

3
এছাড়াও অক্ষর বিজোড় সংখ্যা হ্যান্ডেল করার জন্য শুধু প্রতিস্থাপন zip()সঙ্গে itertools.zip_longest():map(''.join, zip_longest(*[iter(s)]*2, fillvalue=''))
পাওলো Freitas,

এছাড়াও দরকারী জন্য ডক্সmaps()
winklerrr

56

আমি মনে করি এটি তাত্ক্ষণিক সংস্করণের চেয়ে সংক্ষিপ্ত এবং আরও পঠনযোগ্য:

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)))

7
তবে সত্যিই দক্ষ নয়: যখন স্ট্রিংয়ের জন্য প্রয়োগ করা হয়: অনেকগুলি অনুলিপি
এরিক

1
এছাড়া যদি SeQ জেনারেটরের, যা কি itertools সংস্করণ হয় কাজ করছে না জন্য । যে ওপি এর জন্য বলেছিল তা নয়, তবে এটি ইরটোলের সংস্করণটি এত সহজ নয় বলে সমালোচনা করা ন্যায়সঙ্গত নয়।
ক্রাইংসাইক্লোপস

23

আমি এই সমাধানটি পছন্দ করি:

s = '1234567890'
o = []
while s:
    o.append(s[:2])
    s = s[2:]


11

আপনি grouper()রেসিপিটি ব্যবহার করতে পারেন itertools:

পাইথন 2.x:

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)

পাইথন 3.x:

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)

এই ফাংশনগুলি মেমরি-দক্ষ এবং কোনও পুনরাবৃত্তির সাথে কাজ করে।


5

নিম্নলিখিত কোড ব্যবহার করে দেখুন:

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
পাওলো

4
>>> 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']

3

এটা চেষ্টা কর:

s='1234567890'
print([s[idx:idx+2] for idx,val in enumerate(s) if idx%2 == 0])

আউটপুট:

['12', '34', '56', '78', '90']

2

সর্বদা হিসাবে, যারা একটি লাইনার ভালবাসেন

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
toonarmycaptain

enumerateদুটি পুনরাবৃত্ত ফেরত দেয়, সুতরাং এগুলি রাখার জন্য আপনার দুটি স্থানের প্রয়োজন। তবে এই ক্ষেত্রে কোনও কিছুর জন্য আসলে আপনার দ্বিতীয় পুনরাবৃত্তের দরকার নেই।
ড্যানিয়েল এফ

1
বরং blahআমি একটি আন্ডারস্কোর বা ডবল আন্ডারস্কোর ব্যবহার করতে পছন্দ, দেখুন: stackoverflow.com/questions/5893163/...
অ্যান্ডি রয়েল

1

সংক্ষিপ্ত স্ট্রিংয়ের জন্য একটি সাধারণ পুনরাবৃত্ত সমাধান:

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)

, যা পুনরাবৃত্তিমূলক পদ্ধতির সাধারণ স্পষ্টতাকে এবং বিজয়িত প্যাটার্নটিকে আরও স্পষ্টভাবে চিত্রিত করে (যদিও বাস্তবে এটি এটি করার প্রয়োজন হয় না)


1

আমি একই পরিস্থিতিতে জড়িত ছিল।

এটি আমার পক্ষে কাজ করেছে

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']

0

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


-1

এটি লুপের জন্য একটি সাধারণ দ্বারা অর্জন করা যেতে পারে।

a = '1234567890a'
result = []

for i in range(0, len(a), 2):
    result.append(a[i : i + 2])
print(result)

আউটপুটটি ['12', '34', '56', '78', '90', 'এ'] এর মতো দেখাচ্ছে


2
এই কোডটি প্রশ্নের উত্তর দিতে পারে, কেন এবং / অথবা এই কোডটির প্রশ্নের উত্তর কীভাবে তার দীর্ঘমেয়াদী মানকে উন্নত করে সে সম্পর্কে অতিরিক্ত প্রসঙ্গ সরবরাহ করে।
εηοιτ.εηοιτ.βε

2
এটি এখানে যেমন একই সমাধান: স্ট্যাকওভারফ্লো.com
জর্জি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.