স্ট্রিংকে নির্দিষ্ট দৈর্ঘ্যে পুনরাবৃত্তি করুন


204

একটি নির্দিষ্ট দৈর্ঘ্যের একটি স্ট্রিং পুনরাবৃত্তি করার একটি কার্যকর উপায় কি? উদাহরণ:repeat('abc', 7) -> 'abcabca'

আমার বর্তমান কোডটি এখানে:

def repeat(string, length):
    cur, old = 1, string
    while len(string) < length:
        string += old[cur-1]
        cur = (cur+1)%len(old)
    return string

এটি করার জন্য আরও ভাল (আরও অজগর) উপায় আছে? হয়তো তালিকা বোঝার ব্যবহার?

উত্তর:


73
def repeat_to_length(string_to_expand, length):
   return (string_to_expand * ((length/len(string_to_expand))+1))[:length]

পাইথন 3 এর জন্য:

def repeat_to_length(string_to_expand, length):
    return (string_to_expand * (int(length/len(string_to_expand))+1))[:length]

5
দেখে মনে হচ্ছে এটি পূর্ণসংখ্যা বিভাগের সুবিধা নিচ্ছে। যে প্রয়োজন হতে না //পাইথন 3? বা সরিয়ে ফেলা +1এবং সিলিং ফাংশনে একটি স্পষ্ট কল ব্যবহার করা যথেষ্ট। এছাড়াও, একটি দ্রষ্টব্য: উত্পন্ন স্ট্রিংটির আসলে অতিরিক্ত পুনরাবৃত্তি হয় যখন এটি সমানভাবে ভাগ হয়; অতিরিক্ত স্প্লাইস দ্বারা কাটা হয়। প্রথমে আমাকে বিভ্রান্ত করেছে।
jpmc26

int()এখানে একই কাজ করে তবে হ্যাঁ, //এটি অণুবীক্ষণিক দিক থেকে দ্রুততর হতে পারে, কারণ এটি দুটি পরিবর্তে এক আদেশে বিভাজন এবং তলকে করে।
ডায়োস্কেচ 2

667

জেসন শায়িয়ারের উত্তরটি সঠিক তবে এটি আরও কিছু ব্যবহার করতে পারে।

প্রথমে, একটি স্ট্রিংকে বারবার সংখ্যার পুনরাবৃত্তি করতে, আপনি ওভারলোড হওয়া গুণটি ব্যবহার করতে পারেন:

>>> 'abc' * 7
'abcabcabcabcabcabcabc'

সুতরাং, একটি স্ট্রিং পুনরাবৃত্তি না হওয়া পর্যন্ত এটা অন্তত দীর্ঘ দৈর্ঘ্য যদি আপনি চান হিসাবে, আপনি পুনরাবৃত্তি যথাযথ সংখ্যা গণনা এবং যে গুণ অপারেটর ডান দিকে বসিযে হিসাবে:

def repeat_to_at_least_length(s, wanted):
    return s * (wanted//len(s) + 1)

>>> repeat_to_at_least_length('abc', 7)
'abcabcabc'

তারপরে, আপনি এটি অ্যারের টুকরোগুলির সাহায্যে সঠিক দৈর্ঘ্যে ছাঁটাই করতে পারেন:

def repeat_to_length(s, wanted):
    return (s * (wanted//len(s) + 1))[:wanted]

>>> repeat_to_length('abc', 7)
'abcabca'

বিকল্প হিসাবে, পিলমোডের উত্তরে বলা হয়েছে যে সম্ভবত আর কেউ খেয়াল করার মতো যথেষ্ট পরিমাণে স্ক্রল করে না, আপনি divmodএকবারে একবারে প্রয়োজনীয় পূর্ণ পুনরাবৃত্তির সংখ্যা এবং অতিরিক্ত অক্ষরের সংখ্যা গণনা করতে ব্যবহার করতে পারেন :

def pillmod_repeat_to_length(s, wanted):
    a, b = divmod(wanted, len(s))
    return s * a + s[:b]

কোনটা ভাল? আসুন এটি মাপদণ্ড করুন:

>>> import timeit
>>> timeit.repeat('scheirer_repeat_to_length("abcdefg", 129)', globals=globals())
[0.3964178159367293, 0.32557755894958973, 0.32851039397064596]
>>> timeit.repeat('pillmod_repeat_to_length("abcdefg", 129)', globals=globals())
[0.5276265419088304, 0.46511475392617285, 0.46291469305288047]

সুতরাং, পিলমোডের সংস্করণটি 40% ধীর গতির মতো, যা খুব খারাপ personally এর প্রায় বেশ কয়েকটি সম্ভাব্য কারণ রয়েছে, এটি প্রায় 40% আরও বাইকোড নির্দেশাবলীর সাথে সংকলন করে শুরু হয়।

দ্রষ্টব্য: এই উদাহরণগুলি //পূর্ণসংখ্যা বিভাগ কেটে নেওয়ার জন্য নতুন-ইশ অপারেটর ব্যবহার করে। এটিকে প্রায়শই পাইথন 3 বৈশিষ্ট্য বলা হয় , তবে পিইপি 238 অনুসারে এটি পাইথন ২.২-এ ফিরে সমস্ত পথে চালু হয়েছিল। আপনি শুধুমাত্র আছে পাইথন 3 (অথবা মডিউল আছে এটি ব্যবহার করতে from __future__ import division) কিন্তু আপনি করতে পারেন এটা নির্বিশেষে ব্যবহার করুন।


8
না, ওপি ফলাফলটি দৈর্ঘ্যের 7 হতে চায় (এটি 3 এর একক নয়)।
ইয়ানস

1
আমি কিছুটা দ্বন্দ্ব করছি কারণ এটি ওপির পক্ষে সঠিক উত্তর নয় তবে আমার এবং অন্যান্য 489 জনের পক্ষে সঠিক উত্তর ...
ম্যাট ফ্লেচার

2
@ ম্যাটফ্লেচার আপনি কেবল আমাকে "গৃহীত উত্তরের ব্যাখ্যাকারী হিসাবে এটি পুনরায় লিখতে হবে " থেকে "আমি এটি পুনরায়
লিখব



14
from itertools import cycle, islice
def srepeat(string, n):
   return ''.join(islice(cycle(string), n))

যখন আমি কেবল স্ট্রিংয়ের মাধ্যমে পুনরাবৃত্তি করতে পারি তখন এটি ব্যবহার করি (এর পরে আর যোগদানের প্রয়োজন নেই)। পাইথন লাইব্রেরিগুলিকে কাজটি করতে দিন।
উইহল্কে :01

7

সম্ভবত সবচেয়ে দক্ষ সমাধান নয়, তবে অবশ্যই সংক্ষিপ্ত এবং সহজ:

def repstr(string, length):
    return (string * length)[0:length]

repstr("foobar", 14)

"Foobarfoobarfo" দেয়। এই সংস্করণটির একটি বিষয় হ'ল দৈর্ঘ্য <লেন (স্ট্রিং) হলে আউটপুট স্ট্রিংটি কেটে যাবে। উদাহরণ স্বরূপ:

repstr("foobar", 3)

"ফু" দেয়।

সম্পাদনা: আসলে আমার আশ্চর্যরূপে এটি বর্তমানে গৃহীত সমাধানের ('পুনরাবৃত্ত_পরে_ দৈর্ঘ্য' ফাংশন) এর চেয়ে দ্রুত, কমপক্ষে সংক্ষিপ্ত স্ট্রিংগুলিতে:

from timeit import Timer
t1 = Timer("repstr('foofoo', 30)", 'from __main__ import repstr')
t2 = Timer("repeat_to_length('foofoo', 30)", 'from __main__ import repeat_to_length')
t1.timeit()  # gives ~0.35 secs
t2.timeit()  # gives ~0.43 secs

সম্ভবতঃ যদি স্ট্রিংটি দীর্ঘ ছিল, বা দৈর্ঘ্য খুব বেশি ছিল (অর্থাত্ যদি string * lengthঅংশটির অপব্যয় বেশি হয় ) তবে এটি খারাপভাবে সম্পাদন করবে। এবং বাস্তবে এটি যাচাই করার জন্য আমরা উপরেরটি সংশোধন করতে পারি:

from timeit import Timer
t1 = Timer("repstr('foofoo' * 10, 3000)", 'from __main__ import repstr')
t2 = Timer("repeat_to_length('foofoo' * 10, 3000)", 'from __main__ import repeat_to_length')
t1.timeit()  # gives ~18.85 secs
t2.timeit()  # gives ~1.13 secs

1
আপনি সর্বোচ্চ অপ্টিমাইজেশনের জন্য ইনপুট এবং আউটপুট দৈর্ঘ্যের উপর ভিত্তি করে দুটি সংস্করণের মধ্যে একটি স্যুইচ যুক্ত করতে পারেন।
ম্যাড পদার্থবিদ

6

কেমন string * (length / len(string)) + string[0:(length % len(string))]


length / len(string)প্রথম বন্ধনীতে মোড়ক লাগানো দরকার এবং আপনি সর্বশেষটি মিস করছেন ]
মাইকওয়াইয়াট 2'10

1
আমার মতে এখনও অবধি সবচেয়ে পঠনযোগ্য / স্বজ্ঞাত। আমি মনে করি আপনাকে //পাইথন 3 তে পূর্ণসংখ্যা বিভাগের জন্য ব্যবহার করতে হবে 0the স্প্লাইসটি alচ্ছিক। (কোলন অবশ্যই প্রয়োজন))
jpmc26


5

এটি নয় যে এই প্রশ্নের যথেষ্ট উত্তর পাওয়া যায় নি, তবে একটি পুনরাবৃত্তি ফাংশন রয়েছে; কেবলমাত্র একটি তালিকা তৈরি করতে হবে এবং তারপরে আউটপুটটিতে যোগ দিতে হবে:

from itertools import repeat

def rep(s,n):
  ''.join(list(repeat(s,n))

এটি প্রশ্নের উত্তর দেয় না। এটি এক বার বার স্ট্রিং পুনরাবৃত্তি করে, এক্স দৈর্ঘ্য হওয়া পর্যন্ত এটি পুনরাবৃত্তি করে না। যেমন "abc", 4আশা করবে "abca"। এটি তৈরি করবেabcabcabcabc
মার্কাস লিন্ড

3

ইয়ে পুনরুক্তি!

def trunc(s,l):
    if l > 0:
        return s[:l] + trunc(s, l - len(s))
    return ''

চিরকালের জন্য স্কেল করবে না তবে ছোট স্ট্রিংয়ের জন্য এটি ঠিক। এবং এটি সুন্দর।

আমি স্বীকার করি আমি কেবল লিটল স্কিমার পড়েছি এবং আমি এখনই পুনরাবৃত্তি পছন্দ করি।


1

তালিকা অনুধাবন ব্যবহার করে এটি করার এটি একটি উপায়, যদিও rptস্ট্রিংয়ের দৈর্ঘ্য বাড়ার সাথে সাথে এটি ক্রমশ বর্জ্য ।

def repeat(rpt, length):
    return ''.join([rpt for x in range(0, (len(rpt) % length))])[:length]


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