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: return('Welcome')
(如果问候语不在列表中),我希望收到“欢迎”,但无论是否输入现有或不存在的语言,它都会返回“欢迎”。< / p>
我也曾尝试elif language =!= k
,但它似乎以同样不受欢迎的方式工作
答案 0 :(得分:8)
你想要这个:
from .models import User,Player,Game,Match,Team,Post, db as models_db
models_db.create_all()
正如您的代码所代表的那样,它只检查字典中的第一项。如果该键匹配,则返回适当的值。否则,它返回&#34;欢迎,&#34;但它永远不会转移到第二个项目。
在我的代码中,它会检查所有项目,并在找到匹配项后立即返回正确的值。只有找不到匹配才会返回&#34;欢迎。&#34;
顺便提一下,这是一个更简单的代码版本:
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')
dict.get
允许您进行字典查找,如果找不到该项,则使用默认值。
这基本上是为了这一点(但def greet(language):
database = {'english': 'Welcome',
'czech': 'Vitejte',
'danish': 'Velkomst',
'welsh': 'Croeso'}
return database.get(language, 'Welcome')
是首选):
dict.get
答案 1 :(得分: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)时间内完成。
答案 2 :(得分:3)
这是因为return
语句在第一次分支到else
劫持控件时执行,从for
退出,退出该函数。例如,您可以将else
作为for
的一部分移动;只有当'Welcome'
用尽 时,才会返回for
:
...
for k, v in database.items():
if language == k:
return v
else:
return 'Welcome'
或使用字典的get
方法返回默认值:
...
return database.get(lang, 'Welcome')
答案 3 :(得分: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 欢迎强>
答案 4 :(得分: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
答案 5 :(得分: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
打印(迎接(&#39;捷克&#39;))
Vitejte
打印(迎接(&#39; zabcczech&#39;))
欢迎