Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在列表中查找部分字典元素的索引_Python_Dictionary_Indexing - Fatal编程技术网

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

Python 在列表中查找部分字典元素的索引,python,dictionary,indexing,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应该

我有一个字典列表如下:

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

应该相对容易实现。为Python3编写,在Python2中应该使用
.iteritems()
(不创建临时列表)


但是可以使用更好的名称…

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


如果您正在寻找单行程序(与可重用代码相反),并且您的数据量很小,那么您可以执行以下操作:

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

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

编辑:请将您接受的答案更改为@delnan的更正答案,该答案非常相似,可能表现更好。

出于好奇,您为什么需要此答案?看起来这类事情可能值得重新思考数据结构,尽管并非如此。@Katrielex:我正在构建的数据结构是另一个流程的要求,它要求数据符合特定标准。-1因为我的行
,当前dicts中的dict:
导致了一个
值错误:太多的值无法解包
,这与Python3和Python2以及
iteritems()
的使用无关(因为
dicts
是一个
列表,而不是字典)。@martineau:我只是忘记了枚举调用。修正了它。好吧,这样更好,我将取消我的否决票——您真的应该在发布代码之前测试代码。不过,我不会投赞成票,因为尽管它现在运行、工作并且很短,但它仍然有潜在的二次或二次计算时间复杂性O(n1xn2),这是可以大大改进的。@martineau:再来一次?我看不出
all(在n个dict中输入key,在dict.items())
len(filter(n个dict.has,dict.keys())==key\u count更复杂。事实上,“我的”将停止搜索
n_dict
,只要
partial
中没有密钥,而“你的”总是检查所有密钥!另外,我认为最坏的情况是大O(n1*n2),因为为了
提高
,我们需要看到没有一个dict等于所有
部分
(这也是您的代码所做的)。。。还是我弄错了?不,你对表演没弄错,我错了。这就是说,我现在觉得您的正确答案比这两个答案更快。-1因为
index()
方法搜索的键是硬编码的(to
'id'
),而且它假设这是
obj
中唯一需要匹配的(key.value)对。一个抽象的“DictList”类需要有一个更通用的方法,它没有任何抽象性。这是一个列表的实现,旨在以最接近于发帖人期望结果的方式解决发帖人的问题,而不是实现理论词典列表的所有可能用途。也许你应该称之为比
DictList
更不一般的东西。我认为将值硬编码到代码中是一种非常糟糕的做法,因此,至少在非常规例程中,键值也应该成为类属性,或者作为带有默认值的关键字参数传递给
index()
方法。这样做将允许它的值在一个点上更改,而不是在现有代码中的每次出现时更改。非常感谢提供此通用解决方案。非常有帮助。嗯,这是一个快速的解决方案,可以解决我的问题。Thanx对这一个来说太多了。但是,@martineau的答案更一般,也更有用。
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
[elem["id"] for elem in myList].index(8)