检查字典中字典内列表的值

时间:2018-06-23 18:16:08

标签: python list dictionary

我有这本字典(使它变得简单):

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

3 个答案:

答案 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