在列表中查找部分字典元素的索引

时间:2010-11-11 17:37:04

标签: python dictionary indexing

我有一个字典列表如下:

myList=[{'id':1,'key1':'a','key2':'b'},{'id':8,'key1':'c','key2':'d'}, 
        {'id':6,'key1':'a','key2':'p'}]

要查找元素索引,我目前正在执行以下语句:

print myList.index({'id':8,'key1':'c','key2':'d'})

返回1

但是,我想做这样的事情:

print myList.index({'id':8})

应该返回1

4 个答案:

答案 0 :(得分:1)

实施起来应该比较简单。为Python 3编写,在Python 2中,您应该使用.iteritems()(不创建临时列表)。

def partial_dict_index(dicts, dict_part):
    for i, current_dict in enumerate(dicts):
        # if this dict has all keys required and the values match
        if all(key in current_dict and current_dict[key] == val 
                for key, val in dict_part.items()):
            return i
    raise ValueError("...")

虽然可以使用更好的名字......

答案 1 :(得分:1)

如果您正在寻找单线程(而不是可重复使用的代码),并且您的数据量很小,则可以执行以下操作:

[elem["id"] for elem in myList].index(8)

从每个dict中提取id,然后查找提供的id的索引。根据您的总体目标和数据集的外观,这可能是您想要的,也可能不是......

答案 2 :(得分:1)

修改:请将您接受的答案更改为@ delnan的更正答案,该答案非常相似且可能效果更佳。

答案 3 :(得分:-1)

您可以实施自己的列表。这是打印第一个找到的结果的示例。我添加了ValueError来复制.index()的现有行为。

class DictList(list):

    def index(self, obj):
        for i, o in enumerate(self):
            if o['id'] == obj['id']:
                return i
        else:
            raise ValueError('x not in list')


myList = DictList(({'id':1,'key1':'a','key2':'b'},{'id':8,'key1':'c','key2':'d'}, 
                   {'id':6,'key1':'a','key2':'p'}))

>>> print myList.index({'id': 8})
1

>>> print myList.index({'id': 10})
ValueError: x not in list