在字典列表中查找索引

4
如果我知道键名,当数据结构像这样时,如何找到列表索引?
foo = [{'key1': 'value1'}, {'key2': 'value2'}, {'key3': 'value3'}]

例如,给定字符串'key2',它在上面的列表中的索引是多少?
我的当前代码:
for i in xrange(len(foo)):
    if foo[i].keys()[0] == 'key1':
        print i

我很好奇是否有一些巧妙的技巧,不需要显式循环。


2
你有尝试过任何东西吗? - Ashwini Chaudhary
@Josh foo 是一个列表。 - Ashwini Chaudhary
@undefinedisnotafunction现在他为什么要那样做呢?抱歉,我没有意识到我们没有处理一个字典。 - scohe001
@bholben 一定要在问题中附上你的尝试。不,你不能在这里防止一个for循环,但是你可以添加一个break语句来在找到匹配项时停止循环。但是,iCodez的方法是我会使用的。 - Ashwini Chaudhary
1
@bholben - 我把你的评论移到了你的问题中,这样更容易被看到。 - user2555451
显示剩余3条评论
1个回答

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)
>>>

请注意,您还可以将None替换为任何默认值:
>>> next((i for i,d in enumerate(foo) if 'key4' in d), 'not found')
'not found'
>>>

此外,我想提到的是执行以下操作:
if foo[i].keys()[0] == 'key1':

如果字典中有多个项,那么这种方法并不总是有效。这是因为字典的键本质上是无序的:

>>> d = {'abc':1, 'xyz':2}
>>> d.keys()
['xyz', 'abc']
>>>

此外,不需要调用字典的keys方法来搜索其键,因为你可以使用in运算符
>>> 'abc' in d
True
>>> 'def' in d
False
>>>

这种解决方案更加高效,因为它避免了创建不必要的列表。

我认为你现在也应该解释一下使用 if foo[i].keys()[0] == 'key1' 的问题是什么。 :) - Ashwini Chaudhary
生成器对我来说是新的。这似乎是我拥抱它们的绝佳机会。感谢您的帮助! - bholben
@undefinedisnotafunction - 更好了吗? :) - user2555451

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接