Python -遍历字符串中的字符,直到字符串的长度达到另一个字符串的长度



我想写一个函数,它需要两个字符串(消息和关键字),后者比前者短,循环其中的字符,使两个字符串的长度相同。

。消息= "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一样大,然后只取其中足够长的前缀。

您可以使用zipitertools.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))

相关内容

最新更新