有没有不使用条件语句就可以反转字符串的方法?

2024-05-29 05:03:49 发布

您现在位置:Python中文网/ 问答频道 /正文

问题

编写一个程序,接收输入上的一个数字,并根据以下条件打印从1到该数字的值。 它还应该在输入上接收另一个布尔值'rev'。你知道吗

对于给定范围内的每个数字,
-如果数字是3的倍数,或包含数字3,则打印“Jugs”。
-如果数字是5的倍数,或包含数字5,则打印“马克杯”。
-如果数字是7的倍数,或包含数字7,则打印“哈巴狗”。你知道吗

  • 如果数字是3和5的倍数,则打印“JugsMugs”。
    • 另外,如果数字包含3和5,则打印“JugsMugs”
  • 如果数字是3和7的倍数,则打印“JugsPugs”。
    • 另外,如果数字包含3和7,则打印“JugsPugs”
    • 如果数字是3、5和7的倍数,则打印“JugsMugsPugs”。
      • 另外,如果数字包含3、5和7,则打印“JugsMugsPugs”

否则,它会打印号码。你知道吗

反向要求: 如果布尔值“rev”为真,则反转打印顺序。
-“PugsJugsMugs”表示3、5和7的倍数
-“PugsMugs”表示3和7的倍数
-“MugsJugs”表示3和5的倍数
-“PugsJugs”表示5和7的倍数

我所做的

首先,我得到了一个输入“rev”来指示是否需要反转。如果rev为true,则反转字符串,否则不反转。你知道吗

我以前使用过“if”语句,但这里只能使用一个或不使用条件语句。我不知道怎么做。有人能帮帮我吗

“else”工作正常。有人能帮我说“如果”吗

num = int(input())
rev = int(input())
for i in range(1,num+1):
  *if rev:
    string = 'jugs' * bool(i%3==0 or '3' in str(i) or i)
    string = 'mugs'+ string * bool(i%5==0 or '5' in str(i) or i)
    string = 'pugs'+ string * bool(i%5==0 or '5' in str(i) or i)
    print(string or i)*

  else:  
    print("jugs"*(i%3==0 or '3' in str(i)) + "mugs"* (i%5==0 or '5' in str(i)) + "pugs"*(i%7==0 or '7' in str(i)) or i)

如果rev=true或1,则为预期输出

1
2
Jugs
4
Mugs
Jugs
Pugs
8
Jugs
Mugs
11
Jugs
Jugs
Pugs
MugsJugs

Tags: orintruestringrev数字条件bool
1条回答
网友
1楼 · 发布于 2024-05-29 05:03:49

有三个主要问题阻止代码按原样工作。你知道吗

首先,在布尔表达式bool(i%3==0 or '3' in str(i) or i)中,or i始终为真,因为i始终为非零。这意味着不管怎样,当您反转字符串时,它都会同时打印出所有三个值。去掉表达式的or i部分可以解决这个问题。你知道吗

第二,您的意图似乎是通过将下一部分添加到字符串的开头来反向构造字符串。然而,当你写作时

string = 'mugs'+ string * bool(i%5==0 or '5' in str(i) or i)

那个顺序搞混了。如果字符串满足条件,则不将“mugs”添加到字符串的开头,而是将字符串重新定义为等于“mugs”,如果字符串满足mugs的条件,则添加先前的值。相反,只需将+ string移到表达式的末尾即可修复此顺序。你知道吗

最后,一个小的拼写错误。检查i%5==0 or '5' in str(i)两次,而不是检查7。用7替换第二个实例很容易。做这些事情最终会导致:

num = int(input())
rev = int(input())
for i in range(1,num+1):
  if rev:
    string = 'jugs' * bool(i%3==0 or '3' in str(i))
    string = 'mugs' * bool(i%5==0 or '5' in str(i)) + string
    string = 'pugs' * bool(i%7==0 or '7' in str(i)) + string
    print(string or i)

  else:
    print("jugs"*(i%3==0 or '3' in str(i)) + "mugs"* (i%5==0 or '5' in str(i)) + "pugs"*(i%7==0 or '7' in str(i)) or i)

然而,正如其他人所指出的,在反转输出之前构造输出效率更高,甚至可以去掉最后的if语句。例如:

num = int(input())
rev = int(input())
for i in range(1,num+1):
    string = []
    string.append('Jugs' * bool(i % 3 == 0 or '3' in str(i)))
    string.append('Mugs' * bool(i % 5 == 0 or '5' in str(i)))
    string.append('Pugs' * bool(i % 7 == 0 or '7' in str(i)))
    print(''.join(string[::int(not rev) or -1]) or i)

在这里,我将字符串创建为值列表,而不是实际的字符串,这样我就可以颠倒单词的顺序,而不是单个字符。然后,如果rev为真,则按相反顺序连接单词,如果为假,则按正常顺序连接单词。你知道吗

相关问题 更多 >

    热门问题