我目前正在开发这个python代码,我正在尝试将用户姓氏的长度与其名称长度相匹配。
如果用户的姓氏大于他们的消息,那么代码将成功地减去用户名中的多余字符,以使两个变量相等。
但是,如果用户的姓名大于他们的姓氏,则代码应循环遍历用户的姓氏并添加所需的字符数量,以使两个变量相等。
答案 0 :(得分:0)
我使用这个功能:
def pad(key, wanted_len):
lk = len(key)
if lk > wanted_len:
return key[:wanted_len]
else:
bigerkey = key * ((wanted_len / lk) + 1)
return bigerkey[:wanted_len]
if的第一部分非常简单:如果密钥大于预期,只需截断它即可。 Otherwize,使用键上的运算符*
重复n
次,其中n是按键大小划分的预期siwe。
例如:
>>> print 'hello ' * 5
hello hello hello hello hello
来自horns的一个很好的建议简化了以前的代码:
def pad(key, wanted_len):
return (key * ((wanted_len // len(key)) + 1))[:wanted_len]
另一种可能的(更多pythonic)是使用itertools.cycle
:
def pad(key, len):
it = itertools.cycle(key)
return ''.join([it.next() for _ in xrange(len)])
密钥上的迭代器将按照每个next()
提供的可迭代(此处为key)的顺序弹出一个字母,并在可用的结尾循环。
答案 1 :(得分:0)
from itertools import cycle
def combine(text, keyword):
return ''.join(key for key, char in zip(cycle(keyword), text))
cylce为您的关键字生成无限生成器。对于像'abc'这样的关键字,它会产生a,b,c,a,b,c,a,.... zip将在迭代文本后停止。
逐步说明功能: zip(更多信息:https://docs.python.org/2/library/functions.html#zip)
for a, b in zip( [1, 2, 3], ['a', 'b']):
print (a, b)
#1 a
#2 b
# stops after 2 steps, because ['a', 'b'] has only two elements
循环使得无限生成器:
keyword = '12'
# cycle(keyword) -> 1 2 1 2 1 2 .... (infinite times)
text = 'abcde'
for key, char in zip(cycle(keyword), text):
print (key, char)
# 1 a
# 2 b
# 1 c
# 2 d
# 1 e
#stops (cause len(text) == 5)
keys = [key for key, char in zip(cycle(keyword), text)]
#keys == [ '1', '2', '1', '2', '1']
newkeyword = ''.join(keys)
#join joins a iterable of strings with '' as delimiter between them
#newkeyword == '12121'