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

时间:2017-08-11 11:25:50

标签: python list dictionary lambda filter

我有一份水果清单exec()

当我使用lambda [{'name': 'apple', 'qty': 233}, {'name': 'orange', 'qty': '441'}]过滤orange的列表时,我得到了正确的词典,但我无法得到词典的索引。指数应为1而不是0.

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

enter image description here

1 个答案:

答案 0 :(得分:3)

您可以使用列表推导和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'})]

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

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

以下是两种方法的时间安排:

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