Câu trả lời của Jason Scheirer là đúng nhưng có thể sử dụng một số giải trình khác.
Trước hết, để lặp lại một chuỗi số nguyên số lần, bạn có thể sử dụng phép nhân quá tải:
>>> 'abc' * 7
'abcabcabcabcabcabcabc'
Vì vậy, để lặp lại một chuỗi cho đến khi nó dài ít nhất bằng độ dài bạn muốn, bạn tính toán số lần lặp lại thích hợp và đặt nó ở phía bên phải của toán tử nhân:
def repeat_to_at_least_length(s, wanted):
return s * (wanted//len(s) + 1)
>>> repeat_to_at_least_length('abc', 7)
'abcabcabc'
Sau đó, bạn có thể cắt nó theo độ dài chính xác mà bạn muốn với một lát mảng:
def repeat_to_length(s, wanted):
return (s * (wanted//len(s) + 1))[:wanted]
>>> repeat_to_length('abc', 7)
'abcabca'
Ngoài ra, như được đề xuất trong câu trả lời của Pillmod mà có lẽ không ai cuộn xuống đủ xa để chú ý nữa, bạn có thể sử dụng divmod
để tính số lần lặp lại đầy đủ cần thiết và số lượng ký tự phụ, cùng một lúc:
def pillmod_repeat_to_length(s, wanted):
a, b = divmod(wanted, len(s))
return s * a + s[:b]
Cái nào tốt hơn? Hãy để điểm chuẩn cho nó:
>>> 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]
Vì vậy, phiên bản của Pillmod chậm hơn 40%, điều này quá tệ, vì cá nhân tôi nghĩ nó dễ đọc hơn nhiều. Có một số lý do có thể cho việc này, bắt đầu với việc biên dịch các hướng dẫn mã byte thêm khoảng 40%.
Lưu ý: những ví dụ này sử dụng //
toán tử new-ish để cắt bớt số nguyên. Đây thường được gọi là tính năng Python 3, nhưng theo PEP 238 , nó đã được giới thiệu hoàn toàn trong Python 2.2. Bạn chỉ phải sử dụng nó trong Python 3 (hoặc trong các mô-đun có from __future__ import division
) nhưng bạn có thể sử dụng nó bất kể.
//
trong Python 3 sao? Hoặc bỏ+1
và sử dụng một cuộc gọi rõ ràng đến một chức năng trần sẽ đủ. Ngoài ra, một lưu ý: chuỗi được tạo thực sự có sự lặp lại thêm khi nó chia đều; phần phụ bị cắt bởi mối nối. Điều đó làm tôi bối rối lúc đầu.