在词典列表中查找索引

bho*_*ben 4 python indexing list

如果我知道密钥名称,那么当数据结构如此时,如何找到列表索引?

foo = [{'key1': 'value1'}, {'key2': 'value2'}, {'key3': 'value3'}]
Run Code Online (Sandbox Code Playgroud)

例如,给定字符串'key2',上面列表中的索引是什么?

我目前的代码:

for i in xrange(len(foo)):
    if foo[i].keys()[0] == 'key1':
        print i
Run Code Online (Sandbox Code Playgroud)

然而,我很好奇是否有一些不需要显式循环的光滑技术.

iCo*_*dez 6

您可以使用next,enumerate生成器表达式:

>>> foo = [{'key1': 'value1'}, {'key2': 'value2'}, {'key3': 'value3'}]
>>> next((i for i,d in enumerate(foo) if 'key1' in d), None)
0
>>> next((i for i,d in enumerate(foo) if 'key2' in d), None)
1
>>> next((i for i,d in enumerate(foo) if 'key3' in d), None)
2
>>> next((i for i,d in enumerate(foo) if 'key4' in d), None)
>>>
Run Code Online (Sandbox Code Playgroud)

请注意,您也可以None使用任何默认值替换:

>>> next((i for i,d in enumerate(foo) if 'key4' in d), 'not found')
'not found'
>>>
Run Code Online (Sandbox Code Playgroud)

另外,我想提一下:

if foo[i].keys()[0] == 'key1':
Run Code Online (Sandbox Code Playgroud)

如果词典有多个项目,则不会始终有效.这是因为字典的键自然是无序的:

>>> d = {'abc':1, 'xyz':2}
>>> d.keys()
['xyz', 'abc']
>>>
Run Code Online (Sandbox Code Playgroud)

此外,没有必要调用keys字典的方法来搜索其键,因为你有in运算符:

>>> 'abc' in d
True
>>> 'def' in d
False
>>>
Run Code Online (Sandbox Code Playgroud)

此解决方案也更有效,因为它避免了创建不必要的列表.