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)