2010-09-07 212 views
1

級別:初級蟒蛇比較字典

word= 'even' 
dict2 = {'i': 1, 'n': 1, 'e': 1, 'l': 2, 'v': 2} 

我想知道,如果字是在dict2 完全由字母我的方法:

第1步:轉換字字典(dict1)

step2:

for k in dict1.keys(): 
     if k in dict2: 
       if dict1[k] != dict2[k]: 
        return False 
       return True 

通過添加打印語句我可以s即,這簡單地結束得太早,例如 ,例如,一旦滿足第一個IF條件,循環結束,我不會得到正確的答案。我認爲這很容易,但谷歌和python文檔沒有返回任何好的 提示,所以我在這裏嘗試。

由於巴巴

UPDATE

,在單詞的每個字母ocurs需要小於或等於它在dict2 apears的次數的次數。這樣我保證這個詞完全是由dict2的元素組成的。

for k in word.keys(): # word has ben converted to key already 
    if k not in hand: 
     return False 
    elif k in hand: 
     if word[k] > hand[k]: 
      return False 
return True 
+0

是在dict2重要的價值?例如,'dict2 ['v'] = 2'是否意味着'word'最多可以包含2個'v's? – unutbu 2010-09-07 20:17:26

+0

這個想法是評估單詞是否完全由dict2中的字母組成。所以如果單詞包含2個e(eg'even'),那麼如果dict2 [e] = 1,函數將返回False – raoulbia 2010-09-07 21:54:14

回答

0

你只想在所有的檢查後返回true,所以在循環之後粘住它。這裏是對你的代碼的直接修改:

for k in dict1.keys(): 
    if k in dict2: 
     if dict1[k] != dict2[k]: 
      return False 
return True 
+0

感謝Zubin和Brian指出正確使用返回函數!那只是我需要的複習。現在我已經更新了我的帖子,我的代碼是我需要寫的代碼。 – raoulbia 2010-09-07 21:38:57

4
>>> word= 'even' 
>>> dict2 = {'i': 1, 'n': 1, 'e': 1, 'l': 2, 'v': 2} 
>>> set(word).issubset(set(dict2.keys())) 
True 
+0

爲了解釋上面的一點...因爲你不需要key-> value關係,或集是你在找什麼(不是字典)。既然你不需要該命令,並且明確地只需要每種類型的一個元素,那麼一個集合就更合適。 '.keys()'返回一個列表,所以你使用set()構造函數將單詞和鍵列表都設置爲集合。 – jkerian 2010-09-07 20:22:22

0
在你的代碼

,只要將「返回True」被外界所有的循環。也就是說,如果循環完成而沒有找到不匹配的值,則只返回true。這是否真的是你想要的實際代碼很難說,但移動「返回True」可以修復你發佈的代碼中的邏輯錯誤。

1

除非你需要它的東西,不要打擾構建dict1。只是這樣做:

for c in word: 
    if c not in dict2: 
     return False 
return True 

當然,你也可以使用一個set代替dict持有的字母。

0
>>> word = {'e':2, 'v':1, 'n':1} 
>>> hand= {'i': 1, 'n': 1, 'e': 1, 'l': 2, 'v': 2} 
>>> all(k in hand and v <= hand[k] for k,v in word.items()) 
False 

和現在看到的真實情況

>>> hand['e']+=1 
>>> all(k in hand and v <= hand[k] for k,v in word.items()) 
True