2017-06-14 101 views
0
def greet(language): 
    database = {'english': 'Welcome', 
       'czech': 'Vitejte', 
       'danish': 'Velkomst', 
       'welsh': 'Croeso'} 
    for k, v in database.items(): 
     if language == k: 
      return v 
     # else: return('Welcome') 

print(greet('czech')) 
> Vitejte 

如果我取消else`不起作用else: return('Welcome')(所以如果問候語是不在列表中)我希望收到「歡迎」,但它返回「歡迎」不管我進入現有或不存在的語言。蟒蛇`如預期

我還曾試圖elif language =!= k,但它出現在同一個不必要的方式工作

回答

8

希望此相反:

def greet(language): 
    database = {'english': 'Welcome', 
       'czech': 'Vitejte', 
       'danish': 'Velkomst', 
       'welsh': 'Croeso'} 
    for k, v in database.items(): 
     if language == k: 
      return v 

    # Return this only if none of the items matched. 
    return('Welcome') 

當你的代碼目前維持,它永遠只能檢查的第一項字典。如果該鍵匹配,它將返回適當的值。否則,它返回「Welcome」,但它永遠不會移動到第二個項目。

在我的代碼中,它檢查所有項目,並在找到匹配項時立即返回正確的值。只有當它找不到匹配時才返回「歡迎」。

順便說一句,這是代碼的一個更簡單的版本:

def greet(language): 
    database = {'english': 'Welcome', 
       'czech': 'Vitejte', 
       'danish': 'Velkomst', 
       'welsh': 'Croeso'} 
    return database.get(language, 'Welcome') 

dict.get讓你做一個字典查找和使用默認值,如果沒有找到該項目。

它基本上短手此(但dict.get是優選的):

if language in database: 
    return database[language] 
else: 
    return 'Welcome' 
+0

加+1答案,他想知道到底是什麼! – void

3

這是因爲當在第一執行return語句分支到else劫持控制從for,退出功能。例如,您可以將else作爲for的一部分移動;當for耗盡表明'Welcome'只應退還乾淨

... 
for k, v in database.items(): 
    if language == k: 
     return v 
else: 
    return 'Welcome' 

或者使用字典的get方法返回默認:

... 
return database.get(lang, 'Welcome') 
6

看到它這樣的,for循環將列舉項目

我們假設.items()提取的第一項是'english': 'Welcome'。現在如果語言是而不是英文,那麼if將會失敗,所以執行else部分時會返回'Welcome'。只有枚舉的第一項確實是正確的語言,程序纔會返回該值。

但是你做的事情太複雜,你可以使用dict.get(..)回退值

def greet(language): 
    database = {'english': 'Welcome', 
       'czech': 'Vitejte', 
       'danish': 'Velkomst', 
       'welsh': 'Croeso'} 
    return database.get(language,'Welcome')

這也將提升性能:你原來的程序有O(n)的時間複雜度,而查找平均一本字典是在O(1)時間內完成的。

+0

你忘記在你的陳述中得到'key'。 – luoluo

+0

是的,非常感謝:) –

+1

加上+1在字典上平均提及_lookup是在O(1)time_ – void

0

我已經修改了代碼,並附加輸出,以及:

def greet(language): 
    database = {'english': 'Welcome', 
       'czech': 'Vitejte', 
       'danish': 'Velkomst', 
       'welsh': 'Croeso'} 
    for k in database.keys(): 

     if language == k: 
      return database[k] 

    return('Welcome') 


print(greet('english')) 
print(greet('czech')) 
print(greet('welsher')) 
print(greet('danish')) 
print(greet('welsh')) 
print(greet('hindi')) 

輸出: 歡迎 Vitejte 歡迎 Velkomst Croeso 歡迎

0

this SO post看看你會得到一個關於什麼是檢查密鑰是否在字典中的最快方法的想法。

所以你的情況我會說這是檢查最快的方式

def greet(k): 
    database = {'english': 'Welcome', 
       'czech': 'Vitejte', 
       'danish': 'Velkomst', 
       'welsh': 'Croeso'} 
    if k in database: 
     return(database[k]) 
    else: 
     return('Welcome') 
print(greet('welsh')) 

輸出:

Croeso 

但是:

def greet(k): 
    database = {'english': 'Welcome', 
       'czech': 'Vitejte', 
       'danish': 'Velkomst', 
       'welsh': 'Croeso'} 
    if k in database: 
     return(database[k]) 
    else: 
     return('Welcome') 
print(greet('tamil')) 

輸出:

Welcome 
0

無論您提到的是預期的行爲,爲什麼因爲DICTIONARY是一個無序的對象集合。

每當你做dict.items()可以迭代以任何順序,考慮你的榜樣本身:

def greet(language): 
database = {'english': 'Welcome','czech': 'Vitejte','danish': 'Velkomst', 
      'welsh': 'Croeso'} 

for k, v in database.items(): 
    print "k,v :",k,v  --> it may print you in any order 

output: 
     Combination 1: 

     1) english': 'Welcome 2) danish': 'Velkomst 3) czech': 'Vitejte 
     4) welsh': 'Croeso 

     Combination 2: 

     1) welsh': 'Croeso 2) english': 'Welcome 3) czech': 'Vitejte 
     4) danish': 'Velkomst 

     and few more combinations will yield ..... 

所以,在你的榜樣你的第一次迭代比捷克其他就是這個原因你代碼總是返回歡迎

爲了避免這種情況,要麼你可以去dict.get()或簡單地跟蹤變量 如下:

def greet(language): 
var = 0       -> intialized var with 0 
database = {'english': 'Welcome', 
      'czech': 'Vitejte', 
      'danish': 'Velkomst', 
      'welsh': 'Croeso'} 
for k, v in database.items(): 

    if k == language: 
     var = 1     -> if enterd in loop assign var = 1 
     return v 

if (var != 1): 
    return('Welcome')    -> if above compa'ion fails returns welcome 

打印(迎( '捷'))

Vitejte

打印(迎接( 'zabcczech'))

歡迎