2017-07-28 199 views
-4

我想知道为什么print("YES")print("NO")不在for循环中。如果字符串的排列是回文x次,该程序将循环。如果是,则打印“是”,否则打印“否”。Python:需要帮助,for循环打印不能正常工作

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") 
+2

为什么你认为版画应该是在循环? – jackarms

+0

我很困惑:首先,这个程序似乎并没有检查字符串是否是回文(可能你的意思是字符串的一些排列是否可能是回文?)。其次,你为什么想知道为什么印刷报表不在循环中? – MyStackRunnethOver

+0

我是python新手。我简直就是从今天开始。 – Kuais

回答

1

既然你想知道为什么打印语句是不是在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() 

我希望这个版本是为什么打印语句是不是在更清晰循环, 和为什么for i in range(number): string = input()是错误的。

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

Output should be: NO YES YES all in different lines

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

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不应返回字符串List[str]intstr, 而是int和一个列表。 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)]意味着 构建基于range(number), 在每个元素的列表range(number), 填写结果input()在要建立的列表中。 它有时比for循环更清晰。

而实际上numberis_palindrome使用, 只是将其删除

def is_palindrome(string): 
    # function body dose not need to change 

然后改变main功能:

def main(): 
    # change string to strings accordingly 
    number, strings = get_inputs() 
    # change result to result in a way similar to 
    # the change of `string -> strings` in `get_inputs()`. 
    results = [is_palindrome(string) for string in strings] 
    for result in results: 
     report(result) 
    # We could write [report(result) for result in results] here. 
    # But we are not interested in the result list 
    # The result list will be [None, None, ...]. 
    # So this is side-effects only. 
    # A for loop is usually preferred for side-effects only, 
    # and list comprehension for building a list. 
+0

追溯(最近调用最后一次): 文件“ C:/Users/Timothy/PycharmProjects/PythonTesting/Cool.py“,第34行,在 main() 文件”C:/Users/Timothy/PycharmProjects/PythonTesting/Cool.py“,第32行,主要为 报告(结果) NameError:名称'report'未定义 – Kuais

+0

这里有什么问题? – Kuais

+0

对不起。我在缩进中犯了一个错误。 'report'被错误地缩进,成为'is_palindrome'内的嵌套函数。现在修复。 – weakish