【问题标题】:How to get the index of filtered item in list using lambda?如何使用 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))) ?

标签: python list dictionary lambda filter


【解决方案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%。我会发布一些时间安排。
猜你喜欢
  • 1970-01-01
  • 2019-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多