Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有没有更有效的方法来扩展字符串?_Python_String_Loops - Fatal编程技术网

Python 有没有更有效的方法来扩展字符串?

Python 有没有更有效的方法来扩展字符串?,python,string,loops,Python,String,Loops,有人知道有没有一种更有效的方法来扩展字符串,例如fred,将其扩展为字符串的长度明文,这样fred就会变成fredfred #key='fred',msg='plaintext'? def键盘(键,消息): 而len(key)

有人知道有没有一种更有效的方法来扩展字符串,例如
fred
,将其扩展为字符串的长度
明文
,这样
fred
就会变成
fredfred

#key='fred',msg='plaintext'?
def键盘(键,消息):
而len(key)
使用来自
itertools的+:

from itertools import islice, cycle

key = 'fred'
msg = 'plaintext'

print(''.join(islice(cycle(key), len(msg))))
# fredfredf


不如奥斯汀解决方案好,但比您的更好:

你的方法效率低下,因为你

  • concat字符串:旧字符串被销毁,新字符串被创建(一次又一次)
  • 在每次迭代中,您将组合字符串的长度增加一倍(可能会产生巨大的超调)
最好计算一下频率
key
适合
msg
并只创建一个结果字符串(减少已创建/已销毁字符串的数量),同时减少结果字符串的大小

key='fred'
msg='plaintext'

def keypad(key, msg):
    l=len(msg)               # store loally  so you do not call len twice on it
    mult = l//len(key) + 1
    return (key*mult)[:l]    # overshoots maximally by len(k)-1 characters

print(keypad(key,msg))
为以下项创建的字符串:

key = "1234"
msg = "1234567890123456789"
我们创造

"12341234"                         # you, created, thrown away
"1234123412341234"                 # you, created, thrown away
"12341234123412341234123412341234" # you

"12341234123412341234"             # me
  • 你可以用 到 计算所需的完整重复次数,以及 额外字符
def键盘(按键,消息):
通缉犯=len(msg)
a、 b=divmod(通缉犯,len(钥匙))
返回键*a+键[:b]

重复一个字符串,直到它至少达到您想要的长度

  • 计算适当的重复次数并将其放在 乘法运算符的右侧

  • 然后,可以使用数组将其修剪为所需的精确长度 切片:

def键盘(按键,消息):
长度=长度(msg)
return(key*(int(length/len(key))+1))[:length]

无需导入,创建的内容尽可能少。可能更好(不再导入,不再使用源代码):

利用
键上的模除法
-文本与列表相结合(
.join()
将在内部将生成器转换为列表-因此首先使用列表的速度更快-cudos转换为@Austin的注释)

优点:

  • 不进口
  • 无线切割
  • 使用生成器,因此没有中间字符串创建(仅在末尾创建一个)
  • 无需切掉的超调量

建议改为:


对于列表与生成器的速度
join()

+1。好的,但我会把那个发电机换成一个列表<代码>加入
使用列表comp比使用生成器快。@Austin你一直告诉我,我忘了。不间断电源。添加了.Lol。很高兴,你还记得我说的话@奥斯汀甚至找到了它的参考资料;)这似乎是dupe目标目前尚未涵盖的唯一解决方案。
key = "1234"
msg = "1234567890123456789"
"12341234"                         # you, created, thrown away
"1234123412341234"                 # you, created, thrown away
"12341234123412341234123412341234" # you

"12341234123412341234"             # me
key='fred'
msg='plaintext'

def keypad(key, msg):
    lk = len(key)
    lm = len(msg) 
    return ''.join( [ key[idx%lk] for idx in range(lm) ] )

print(keypad(key,msg))
# fredfredf