Python:需要帮助,因为循环打印无法正常工作

时间:2017-07-28 23:31:18

标签: python

我想知道为什么print("YES")print("NO")不在for循环中。如果字符串的排列是回文x次数,则该程序循环。如果是,则打印"是"如果没有它打印" NO"。

number = int(input())
for i in range(number):
string = input()


found = False
char_set = set(string)

d_dict = {}
for c in char_set:
    d_dict[c] = string.count(c)

odd_l = [e for e in d_dict.values() if e%2 == 1]
if len(odd_l) >1:
    pass
else:
    found = True


if not found:
    print("NO")

else:
    print("YES")

1 个答案:

答案 0 :(得分:1)

因为您想知道为什么print语句不在for循环中, 我猜你自己没有写代码。 如果您的代码来自在线教程, 然后我建议换到另一个。

for i in range(number):
string = input()

这不起作用。 Python对布局很敏感。

for i in range(number):
  string = input()

这是有效的Python代码。但语义可能是错误的。见下文。

if not found:
    print("NO")

else:
    print("YES")

对于你的问题,我很明显打印语句不应该在for循环中。

但是,如果我发现很难理解一长串代码, 我通常会尝试将其重构为小函数:

def get_inputs():
  number = int(input())
  for i in range(number):
    string = input()
  return number, string

def is_palindrome(number, string):
  found = False
  char_set = set(string)

  d_dict = {}
  for c in char_set:
    d_dict[c] = string.count(c)

  odd_l = [e for e in d_dict.values() if e%2 == 1]
  if len(odd_l) >1:
    pass
  else:
    found = True

  return found

def report(found):
  if not found:
    print("NO")
  else:
    print("YES")

def main():
  number, string = get_inputs()
  result = is_palindrome(number, string)
  report(result)

main()

我希望这个版本更清楚为什么print语句不在循环中, 以及为什么for i in range(number): string = input()是错误的。

P.S。我以为你的意思是为什么打印不在第二个循环, 但事实证明你的意思是为什么打印不在第一个循环中:

  

输出应该是:NO YES YES全部在不同的行中

是的,你是对的。代码错误缩进。

number = int(input())
for i in range(number):
    string = input()

    # the algorithm does the work

    if not found:
        print("NO")

    else:
        print("YES")

一旦我们发现问题,请尝试修复它。

首先,回到规范:

给出一个数字和一些字符串,报告这些字符串的结果。

然后get_inputs不应该返回intstr, 但是int和字符串列表List[str]。 Python如何代表and的概念? 有些语言使用多个返回值, Python没有。 相反,Python仍然返回一个值,但是这个值是一个包含两个值的元组。

return (first_result, second_result)

Python允许你省略括号:

return first_result, second_result

get_inputs更改为:

def get_inputs():
  # do not need to touch this line
  number = int(input())
  # change string to strings
  strings = [input() for i in range(number)]
  # change return value accordingly
  return number, strings

这里[input() for i in range(number)]表示 根据{{​​1}}建立一个列表, 对于range(number)中的每个元素, 在列表中填写range(number)的结果进行构建。 它有时比for循环更清晰。

input()实际上没有使用number, 只需删除它

is_palindrome

然后更改def is_palindrome(string): # function body dose not need to change 功能:

main