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