2017-07-28 78 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