如何使用 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 获取列表中过滤项目的索引?的主要内容,如果未能解决你的问题,请参考以下文章

F# list 查找项目索引

如何获取相关项目的列表并在 Django 中应用模板过滤器

在 Java8 中使用 lambda 仅在不为空时过滤值

如何在Elasticsearch中过滤或查询索引名称列表?

如何从 SearchBar 中获取 Tableview 中所有项目的当前项目的索引

使用流 API 查找列表中项目的所有索引