我想写一个函数,它需要两个字符串(消息和关键字),后者比前者短,循环其中的字符,使两个字符串的长度相同。
。消息= "hello"关键词= "dog"-我的预期输出是"dogdo"因此,它循环遍历关键字中的字符的次数与消息
的长度相同这里是我尝试的代码,它重复整个字符串而不是每个单独的字符。ie。With message = "hell"和keyword = "do",输出将是"dodododo"而不是"嘟嘟"。当len(keyword)不是len(message)的除数时,我试图让我的输出由this加上余数组成。所以for message="hello"和keyword="dog",预期输出是"dogdo",但我得到的输出是" dogggdogggdogggdogggdogggdoggg"
我知道我循环的方式是错误的,如果有人能告诉我为什么会这样,以及如何让每个字符循环,而不是整个字符串,我将非常感激。
if len(keyword) < len(message):
if len(message) % len(keyword) ==0:
for x in range(0, len(message)):
for char in keyword:
keys += char
else:
for x in range(0, len(message)):
for char in keyword:
keys += char
remainder = len(message)%len(keyword)
for x in range(0, remainder):
keys+= char
您可以使用一些itertools的魔法,或者只是编写您自己的简单生成器,如下所示:
def func(message, keyword):
def gc(s):
while True:
for e in s:
yield e
g = gc(keyword)
for _ in range(len(message)-len(keyword)):
keyword += next(g)
return keyword
print(func('hello', 'dog'))
输出:
dogdo
这根本不需要任何循环:
(keyword * ((len(message+keyword)-1)//len(keyword)))[0:len(message)]
也就是说,制作一个包含足够多的keyword
副本的字符串,至少与message
一样大,然后只取其中足够长的前缀。
您可以使用zip
和itertools.cycle
来获得您正在寻找的效果。
zip
将迭代直到最短的可迭代对象耗尽,cycle
将永远迭代:
from itertools import cycle
message="hello"
keyword="dog"
output = ''.join([x[1] for x in zip(message, cycle(keyword))])
print(output)
按要求输出
如果我正确理解了你的要求,我认为下面的东西是你正在寻找的。
这里的概念是,我们有一个函数为我们完成工作,将关键字和您希望的字符串长度作为输入。
然后循环,直到字符串变得足够长,每次增加一个字符。
def lengthen(keyword, length):
output = keyword
loop_no = 0
while len(output) < length:
char_to_add = keyword[loop_no % len(keyword)]
output += char_to_add
loop_no += 1
return output
longer_keyword_string = lengthen(keyword, len(message))