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')
(因此,如果问候语言不在列表中(,我希望收到"欢迎",但无论我输入现有语言还是不存在语言,它都会返回"欢迎"。
我也尝试过elif language =!= k
但它似乎以同样不需要的方式工作
你想要这个:
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')
按照您的代码当前情况,它只会检查字典中的第一项。如果该键匹配,则返回适当的值。否则,它将返回"欢迎",但永远不会移动到第二项。
在我的代码中,它会检查所有项目,并在找到匹配项后立即返回正确的值。仅当找不到匹配项时,它才会返回"欢迎"。
顺便说一下,这是一个更简单的代码版本:
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'
这样看,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( 时间内完成。
这是因为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')
我也修改了代码并附加了输出:
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'))
输出:欢迎维特伊特欢迎维尔科姆斯特克罗索Welcome
看看这个SO帖子,你会了解检查一个键是否在字典中的最快方法是什么。
所以在你的情况下,我会说这是最快的检查方法
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
你提到的一切都只是预期的行为,为什么,因为字典是一个无序的对象集合。
每当你做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 .....
因此,在您的示例中,您的第一次迭代不是捷克语,这就是您的代码始终返回 Welcome 的原因。
为了避免这种情况,你可以使用 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
打印(问候('捷克语'((
维特伊特
print(greet('zabcczech'((
欢迎