根据少数条件制作字符串



我对这个任务有点问题。我想创建一个包含偶数个字符的字符串。字符数在(30100(范围内。对于该字符串中的偶数位置,字符取自字符范围(a,k(,字符位于字符范围(l,z(的奇数位置。我试着用列表来做,并用列表理解将这个列表转换为字符串,但我失败了。这个代码有什么问题,我如何将其更改为更优雅的方式(我的意思是使用单行列表压缩或其他什么(

def get_text():
def get_char_range(a1: str, b1: str):
for c in range(ord(a1), ord(b1) + 1):
yield c
message = [] * random.randint(30, 100)
for i, idx in enumerate(message):
if idx % 2 == 0:
message.append(get_char_range('a', 'k'))
else:
message.append(get_char_range('l', 'z'))
return message

def main() -> None:
message = get_text()
print(message)

if __name__ == '__main__':
main()

[]

我厌倦了使用列表理解,比如这个

return [message.append(get_char_range('a', 'z') if idx % 2 == 0 else message.append(get_char_range('l', 'z')) for idx in message]

注意:如果有一组样本数据来查看我们是否正确理解问题陈述,会有所帮助

首先,您的[]结果是由以下行引起的:

[] * random.randint(30, 100)

将空列表乘以一个数字会返回一个空列表,因为里面没有元素可以相乘。还要注意,如果您希望字符串的长度为偶数,则可以使用random.randrange(30, 101, 2)。请注意,stop参数是独占的。

现在让我们用代码来解决这个问题。这应该是长代码的工作版本。它从[30100]中取一个随机的偶数长度,并将其存储在str_len中。

然后,它遍历range(str_len)中的所有值,并检查它是偶数还是奇数。根据结果,它使用相应的参数调用helper(您以前调用的函数是get_char_range(。

def get_text():
def helper(a1: str, b1: str):
yield from (chr(c) for c in range(ord(a1), ord(b1)+1))
message = []
str_len = random.randrange(30, 101, 2)
for idx in range(str_len):
if idx % 2 == 0:
message.append(helper('a', 'k'))
else:
message.append(helper('l', 'z'))
return message

def main() -> None:
message = get_text()
print(message)

if __name__ == '__main__':
main()

我们可以通过意识到,由于字符串是偶数,它将简单地在两组数字str_len/2之间交替。这允许我们写:

def get_text():
return ''.join(([chr(c) for c in range(ord('a'), ord('k')+1)]+[chr(c) for c in range(ord('k'), ord('z')+1)])*(random.randrange(30, 101, 2)//2))


if __name__ == '__main__':
print(get_text())

这是少数,所以让我们打开它。

  1. [chr(c) for c in range(ord('a'), ord('k')+1)]+[chr(c) for c in range(ord('k'), ord('z')+1)]

这会添加两个列表。第一个列表包含ord('a'), ord('k')中的所有数字。第二个列表包含ord('l'), ord('z')中的所有数字。因此,得到的列表将具有从ord('a')ord('z')的所有数字。

  1. *(random.randrange(30, 101, 2)//2)

如前所述,random.randrange(30, 101, 2)从[330101中随机选择一个偶数。当我们浏览列表时,我们意识到其他元素都是偶数,因此,最终答案将由第一步的连接列表乘以字符串长度除以2组成(//用于返回整数,因为不能将列表乘以浮点值(。

3.''.join(fancy_stuff)

这将数字列表连接到一个字符串中。

请注意,上述解决方案的可读性得分为:0/100。如果其他人要读你的代码,千万不要写这个。

如果这是你想要的,请告诉我!

最新更新