如何使用 lambda 获取列表中过滤项的索引?

Ste*_*hen 7 python lambda dictionary list filter

我有一份水果清单 [{'name': 'apple', 'qty': 233}, {'name': 'orange', 'qty': '441'}]

当我过滤列表以orange使用 lambda 时,list(filter(lambda x: x['name']=='orange', fruits)),我得到了正确的字典,但我无法获得字典的索引。索引应该是 1 而不是 0。

如何获得过滤项目的正确索引?

在此处输入图片说明

Chr*_*ean 12

您可以使用列表理解,enumerate()而是:

>>> fruits = [{'name': 'apple', 'qty': 233}, {'name': 'orange', 'qty': '441'}]
>>> [(idx, fruit) for idx, fruit in enumerate(fruits) if fruit['name'] == 'orange']
[(1, {'name': 'orange', 'qty': '441'})]
Run Code Online (Sandbox Code Playgroud)

就像评论中发布的@ChrisRands 一样,您也可以filter通过为您的fruits列表创建一个枚举对象来使用:

>>> list(filter(lambda fruit: fruit[1]['name'] == 'orange', enumerate(fruits)))
[(1, {'name': 'orange', 'qty': '441'})]
>>> 
Run Code Online (Sandbox Code Playgroud)

以下是这两种方法的一些时间:

>>> setup = \
      "fruits = [{'name': 'apple', 'qty': 233}, {'name': 'orange', 'qty': '441'}]"
>>> listcomp = \
     "[(idx, fruit) for idx, fruit in enumerate(fruits) if fruit['name'] == 'orange']"
>>> filter_lambda = \
     "list(filter(lambda fruit: fruit[1]['name'] == 'orange', enumerate(fruits)))"
>>> 
>>> timeit(setup=setup, stmt=listcomp)
1.0297133629997006
>>> timeit(setup=setup, stmt=filter_lambda)
1.6447856079998928
>>> 
Run Code Online (Sandbox Code Playgroud)