根据另一个字符串的长度操作要重复的字符串

时间:2015-01-26 18:14:10

标签: python python-3.x

我正在开发一个python项目,我需要包含一个输入和另一个值(将被操作)。

例如, 如果我输入字符串'StackOverflow',以及要操作'test'的值,程序将通过重复和修剪字符串使可操作变量等于字符数。这意味着'StackOverflow''test'会输出'testtesttestt'

这是我到目前为止的代码:

originalinput = input("Please enter an input: ")
manipulateinput = input("Please enter an input to be manipulated: ")
while len(manipulateinput) < len(originalinput):

我想要包含一个for循环来继续休息,但我不确定如何使用它来有效地操纵字符串。任何帮助将不胜感激,谢谢。

4 个答案:

答案 0 :(得分:3)

itertools.cycle方法:

from itertools import cycle

s1 = 'Test'
s2 = 'StackOverflow'
result = ''.join(a for a, b in zip(cycle(s1), s2))

鉴于你提到明文 - a是你的关键,b将是明文中的角色 - 所以你可以用它来轻松地操纵配对。

我猜测你最终会得到类似的东西:

result = ''.join(chr(ord(a) ^ ord(b)) for a, b in zip(cycle(s1), s2))
# '\x07\x11\x12\x17?*\x05\x11&\x03\x1f\x1b#'
original = ''.join(chr(ord(a) ^ ord(b)) for a,b in zip(cycle(s1), result))
# StackOverflow

答案 1 :(得分:2)

尝试这样的事情:

def trim_to_fit(to_trim, to_fit):
     # calculate how many times the string needs
     # to be self - concatenated
     times_to_concatenate = len(to_fit) // len(to_trim) + 1
     # slice the string to fit the target
     return (to_trim * times_to_concatenate)[:len(to_fit)]

它使用slicing,并且python中X和字符串的乘法连接字符串X次。

输出:

>>> trim_to_fit('test', 'stackoverflow')
'testtesttestt'

您还可以在字符串上创建无限循环generator

# improved by Rick Teachey
def circular_gen(txt):
    while True:
        for c in txt:
            yield c

使用它:

>>> gen = circular_gen('test')
>>> gen_it = [next(gen) for _ in range(len('stackoverflow'))]
>>> ''.join(gen_it)
'testtesttestt'

答案 2 :(得分:2)

这里有一些好的Pythonic解决方案......但如果您的目标是了解while循环而不是itertools模块,那么它们将无济于事。在这种情况下,也许您只需要考虑如何使用+运算符生成字符串并使用切片修剪它:

originalinput = input("Please enter an input: ")
manipulateinput = input("Please enter an input to be manipulated: ")
output = ''
while len(output) < len(originalinput):
    output += manipulateinput
output = output[:len(originalinput)]

(请注意,在真正的Python代码中,这种字符串操作通常是不受欢迎的,你应该使用其中一种(例如,Reut Sharabani的回答)。

答案 3 :(得分:0)

您需要的是一种一遍又一遍地从manipulateinput字符串中取出每个字符的方法,这样您就不会用完字符。

您可以通过将字符串相乘,以便根据需要重复多次:

mystring = 'string'
assert 2 * mystring == 'stringstring'

但重复多少次?好吧,你使用len获得字符串的长度:

assert len(mystring) == 6

因此,为了确保您的字符串至少与另一个字符串一样长,您可以这样做:

import math.ceil # the ceiling function
timestorepeat  = ceil(len(originalinput)/len(manipulateinput))
newmanipulateinput = timestorepeat * manipulateinput

另一种方法是使用int division,或//

timestorepeat  = len(originalinput)//len(manipulateinput) + 1
newmanipulateinput = timestorepeat * manipulateinput

现在你可以使用for循环而不会耗尽字符:

result = '' # start your result with an empty string 
for character in newmanipulateinput: 
    # test to see if you've reached the target length yet
    if len(result) == len(originalinput):
        break
    # update your result with the next character
    result += character 
    # note you can concatenate strings in python with a + operator 
print(result)