我有这本字典(使它变得简单):
tmdbMovie = {'spoken_languages': [{'iso_639_1': 'pt', 'name': 'Português'}]}
我正在尝试构建IF子句,以检查“Português”是否是我的字典的有效键。它没有按您预期的那样工作。到目前为止,我已经完成了:
if 'Português' in [tmdbMovie['spoken_languages'][i]['name'] for i in tmdbMovie['spoken_languages']]:
我知道我遗漏了一些东西..在此示例中,字典中的列表只有一个元素,但可能不止一个。
错误:
if 'Português' in [tmdbMovie['spoken_languages'][i]['name'] for i in tmdbMovie['spoken_languages']]:
TypeError: list indices must be integers or slices, not dict
答案 0 :(得分:1)
这应该可以解决问题...
if 'Português' in [i['name'] for i in tmdbMovie['spoken_languages']]
答案 1 :(得分:1)
for i in tmdbMovie['spoken_languages']
将'spoken_languages'
列表中的每个内部字典分配给i
,因此要使用其名称,请使用i['name']
。 FWIW,我将d
用于dict
,而不是通常用于数字索引的i
。例如,
tmdbMovie = {'spoken_languages': [{'iso_639_1': 'pt', 'name': 'Português'}]}
if 'Português' in [d['name'] for d in tmdbMovie['spoken_languages']]:
print('Yes')
输出
Yes
更好的方法是使用any
:
if any(d['name'] == 'Português' for d in tmdbMovie['spoken_languages']):
print('Yes')
any
一旦找到匹配项便停止查找。同样,in
运算符在列表上的效率也不高,因为它必须对列表执行线性扫描,直到找到匹配项为止。 in
非常适合搜索字典或集合。另外,any
可以立即开始搜索,您的版本必须先建立完整的名称列表,然后in
才能开始扫描。
答案 2 :(得分:0)
您可以使用列表理解或生成器表达式,如@ PM2Ring所述。
但是,如果您要经常检查某种语言是否存在,则最好先创建set
并使用set
可用的O(1)查找。 >
这是一个例子:
from operator import itemgetter
tmdbMovie = {'spoken_languages': [{'iso_639_1': 'pt', 'name': 'Português'},
{'iso_639_2': 'pt', 'name': 'Français'}]}
language_names = set(map(itemgetter('name'), tmdbMovie['spoken_languages']))
if 'Português' in language_names:
# do something