如何使用 lambda 获取列表中过滤项目的索引?
Posted
技术标签:
【中文标题】如何使用 lambda 获取列表中过滤项目的索引?【英文标题】:How to get the index of filtered item in list using lambda? 【发布时间】:2018-01-19 21:42:04 【问题描述】:我有一份水果清单['name': 'apple', 'qty': 233, 'name': 'orange', 'qty': '441']
当我使用 lambda list(filter(lambda x: x['name']=='orange', fruits))
过滤 orange
的列表时,我得到了正确的字典,但我无法获取字典的索引。索引应该是 1 而不是 0。
如何获得过滤项目的正确索引?
【问题讨论】:
list(filter(lambda x: x[1]['name']=='orange', enumerate(fruits)))
?
【参考方案1】:
您可以使用列表推导和 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')]
就像在 cmets 中发布的 @ChrisRands 一样,您也可以通过为您的 fruits
列表创建一个枚举对象来使用 filter
:
>>> 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
>>>
【讨论】:
谢谢,它不是比过滤器 lambda 慢吗?可以通过filter lambda实现同样的效果吗? 过滤过滤器并且不关心索引。你可以用过滤器来做到这一点 @Steve 好吧,这取决于。filter
+ lambda
can 函数调用开销和局部变量访问速度较慢,但我不确定 100%。我会发布一些时间安排。以上是关于如何使用 lambda 获取列表中过滤项目的索引?的主要内容,如果未能解决你的问题,请参考以下文章