คำตอบของ Jason Scheirer นั้นถูกต้อง แต่สามารถใช้การอธิบายเพิ่มเติมได้บ้าง
ก่อนอื่นให้ทำซ้ำสตริงด้วยจำนวนเต็มคูณคุณสามารถใช้การคูณมากเกินไป:
>>> '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'
อีกทางเลือกหนึ่งตามคำแนะนำของ pillmodที่อาจไม่มีใครเลื่อนลงมามากพอที่จะสังเกตเห็นอีกต่อไปคุณสามารถใช้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]
ดังนั้นเวอร์ชั่นของ Pillmod นั้นช้ากว่า 40% ซึ่งแย่มากเนื่องจากโดยส่วนตัวแล้วฉันคิดว่ามันอ่านง่ายกว่ามาก มีสาเหตุหลายประการที่เป็นไปได้นี้เริ่มต้นด้วยการรวบรวมเพื่อคำแนะนำ bytecode เพิ่มเติมประมาณ 40%
หมายเหตุ: ตัวอย่างเหล่านี้ใช้ตัวดำเนินการ new-ish //
เพื่อตัดทอนการหารจำนวนเต็ม สิ่งนี้มักเรียกว่าฟีเจอร์ Python 3 แต่ตามPEP 238มันถูกนำกลับมาใช้ใหม่ใน Python 2.2 คุณจะต้องใช้มันใน Python 3 (หรือในโมดูลที่มีfrom __future__ import division
) แต่คุณสามารถใช้ได้โดยไม่คำนึงถึง
//
ใน Python 3 ใช่ไหม หรือวาง+1
และใช้สายที่ชัดเจนไปยังฟังก์ชั่นเพดานจะพอเพียง นอกจากนี้หมายเหตุ: สตริงที่สร้างขึ้นจริง ๆ แล้วมีการทำซ้ำพิเศษเมื่อมันแบ่งเท่า ๆ กัน; ส่วนที่เหลือจะถูกตัดโดยรอยต่อ นั่นทำให้ฉันสับสนในตอนแรก