2011-08-14 25 views
0

我正在學習Python一個月,我試圖通過使用字典來製作一個keygen應用程序。這個想法是將name = input('Name:')中的每個字母與dict.keys()進行比較,並將結果dict.values()輸出爲每個等於dict.keys()的字母。這就是我寫的:Python 3.x基於字典的keygen幫助?

name = input('Name: ') 

kalg = dict() 
kalg['a'] = '50075' 
kalg['b'] = '18099' 
kalg['c'] = '89885' 
etc... 

我tryed寫這個...

for x in kalg.keys(): 
    print(x)[/code] 

...但我需要保持打印(x)的結果,但我不知道該怎麼辦了!如果我這樣做:

for x in kalg.keys(): 
    a = x 

「A」只保留字典:(最後關鍵我認爲這是因爲打印(x)打印一個新行,但我dict.keys的每個鍵()不知道如何解決它(我嘗試通過轉換類型等...但它不工作)。用另一個字符串和打印dict.values()的結果,並在合適的位置的字符串。

對不起,這個愚蠢的問題,但我太激動了書面Python應用程序:)


@卡爾

我STUDING的Python在兩個differt書:「學習Python的」由馬克魯託斯覆蓋的Python 2和適用於Python 3.我檢查了列表中理解上的口袋一個口袋並且我管理寫這個keygen的另外三個變種。現在我想問你如何在具有GUI的實際應用程序中實現此keygen的源代碼,該GUI驗證name_textbox和key_textbox標題是否匹配(我來自基本,因此這是我以前寫的,只是爲了讓你的想法)作爲keygen輸出結果。我知道我可以嘗試通過我自己的方式來做到這一點(我做過,但有nosuccess),但我想先完成本書(口袋裏的一本書),並理解Python的所有主要方面。感謝您的耐心。

回答

0

調用print不能「養」任何東西(因爲沒有變量將其存儲在),並多次分配給一個變量取代了以前的分配。 (我不明白你對這個問題的推理; print(x)的行爲如何與a = x的行爲無關,因爲它們是完全不同的事情)

你的問題歸結爲「我該如何保留來自幾個類似行動的一堆結果?「在概念層面上,答案是「將它們放入容器中」。但明確地將東西放入容器比真正需要更繁瑣。你有你想要的數據的英文說明:「dict.values()爲每個字母的名稱等於dict.keys()」。事實上,等效的Python非常相似。

當然,我們實際上並不想爲每個匹配的字母單獨複製dict.values();而我們實際上並不想將該字母與dict.keys()的整個集合進行比較。作爲程序員,我們必須更加精確:我們正在檢查該字母是否是字典的關鍵字,即它是否在dict.keys()的集合中。幸運的是,這個測試是微不足道的:對於給定的字母,我們檢查letter in dict。當找到這封信時,我們需要相應的值;我們通過正常查找來獲得,因此dict[letter]

然後我們用我們特殊的語法把它們包裝起來:列表理解。我們把括號放在一個列表中,然後寫在裏面(某些表達式計算輸入元素的結果)for(輸入元素的變量名,所以我們可以在第一個表達式中使用它)in(源代碼輸入元素);並且我們可以通過添加if(對輸入元素的一些條件)來同時過濾輸入元素。

所以這很簡單:[kalg[letter] for letter in name if letter in kalg]。請注意,我有name作爲「元素來源」,因爲這應該是。您在描述問題時已經非常清楚地解釋了這一點 - 爲什麼在現有的for-loops中迭代dict.keys()? :)

現在,這個表達式會給我們一個結果列表,例如, ['foo','bar','baz']。如果我們想要一個連續的字符串(我假設你的字典中的所有值都是字符串),那麼我們需要加入它們。幸運的是,這很容易。實際上,因爲我們要將結果傳遞給一個帶有一個參數的函數,所以有一個特殊的語法規則,可以讓我們放下方括號,使其看起來相當整潔。

它比你首先初始化字典更容易;慣用的Python代碼很少實際上需要dict這個詞。

全部放在一起:

kalg = {'a': '50075', 'b': '18099', 'c': '89885'} # etc. 
name = input('Name: ') 
print(''.join(kalg[letter] for letter in name if name in kalg)) 
+0

非常感謝您的回答,現在它的工作,但我不明白爲什麼,如果我把打印(「」加入(kalg [LETTER]任意字母(例如,我輸入'a')輸出顯示每個名稱字母的每個值...我期望它只顯示每個'a'的名字中的'a'值(我希望你明白,因爲我不會說話英文很好) – PyGuy

+0

因爲名字中的每個字母都是名字中的字母,即使你之前已經看到過它 –

+0

我還有一個問題(我把它放在帖子的後面)。 – PyGuy

0

我只能猜測,但是這可能是你想要什麼:

name = input('Name: ') 
kalg = {'a':'50075', 'b': '18099', 'c': '89885'} 
keylist = [kalg[letter] for letter in name] 
print(" ".join(keylist))