2014-12-07 18 views
0

我正在嘗試編寫一個允許用戶回答問題的程序。 問題與用戶選擇的文件中的答案相同,隨後程序將隨機選擇該行,拆分該行並將這兩個項目放入單獨的返回變量中。儘管如此,在比較最後的變量時,我感到茫然。我懷疑我試圖將一個str與一個元組進行比較,這就是爲什麼它不起作用。我當然是一個新手,通過搜索論壇來到目前爲止,但現在我需要你的幫助。與list()返回值的損失,我是否需要將元組轉換爲字符串?

非常感謝!

import random 
import operator 

def random_line(file): 
    return random.choice(list(open(file))) 

def seperate_values(a): 
    line = a 
    lst = line.split() 
    question = list([lst[i] for i in [0]]) 
    answer = list([lst[i] for i in [1]]) 
    return question, answer 



current_list = raw_input("Please enter filename\n") 
chosen_line = random_line(current_list) 

chosen_question, chosen_answer = seperate_values(chosen_line) 

print chosen_question 
print chosen_answer 
user_answer = raw_input("enter the 3-digit code please\n") 

if user_answer == chosen_answer: 
    print "congratulations" 
else: 
    print "failure" 

正在讀取該文件是一個txt,看起來像這樣:

auckland akl 
wellington wlg 
taupo tuo 
hamilton hlz 
+0

它正在閱讀的文件的格式是什麼?你可以發佈一個示例文件嗎? – javanut13 2014-12-07 03:50:15

+0

這是一個簡單的多行文本文本,如下所示:auckland akl – Kalv 2014-12-07 03:55:26

+0

順便說一句,如果您打算擴展該程序,以便從文件中提出多個問題,您應該修復'random_line()'函數,你不得不打開文件,閱讀它的內容,並且創建一個行列表,每一次你想要一個新的隨機行。 – 2014-12-07 07:01:45

回答

0

問題出在線路10 & 11:

question = list([lst[i] for i in [0]]) 
answer = list([lst[i] for i in [1]]) 

我不知道是什麼^%* &#^你正在嘗試在這裏做,但你最後得到兩個列表,而不是兩個字符串。你可以大大簡化這個:

question = lst[0] 
answer = lst[1] 

,然後它會工作,因爲它會得到該文件在給定行兩個字符串,第一個和第二個單詞。

+0

非常感謝。我試圖從列表中獲取特定項目,這是我能找到的唯一代碼行。但是,現在我得到這個錯誤:TypeError:'list'對象不可調用 – Kalv 2014-12-07 04:05:16

+0

這是因爲您可能使用了圓括號而不是方括號。 – javanut13 2014-12-07 04:12:37

1

TL; DR:更換

question = list([lst[i] for i in [0]]) 
answer = list([lst[i] for i in [1]]) 

question = lst[0] 
answer = lst[1] 

或者,更好,更換

line = a 
lst = line.split() 
question = list([lst[i] for i in [0]]) 
answer = list([lst[i] for i in [1]]) 
return question, answer 

question, answer = a.split() 
return question, answer 

更深入的,我們來看看這個表達式:list([lst[i] for i in [0]])。我們有一個列表理解,然後傳遞到list。但是,列表理解已經創建了一個列表,因此將它傳遞到list,然後創建一個與第一個內容相同的副本。所以這與[lst[i] for i in [0]]相同。那是幹什麼的?那麼,對於[0]中的每個i,我們有一個項目,lst[i]。只有一個i,0,所以它創建了一個元素列表,lst[0]。但是您可能需要該項目本身,而不是將其作爲單個元素的列表,因此如果您需要該元素,則應該只使用lst[0]

但後來我走得更遠,並使用拆包。請看,開箱符號不是排除在元組之外的:不,它也可以用在列表中,我們甚至可以將split放在右側,將它壓縮到我上次建議的更改。

如果你願意,你甚至可以簡化功能到這一點:

return a.split() 

但我喜歡解構賦予的清晰度爲questionanswer

+0

輝煌,我真的很感激這個! – Kalv 2014-12-07 04:07:57

相關問題