【问题标题】:Finding last item that matches criteria in Python在 Python 中查找符合条件的最后一项
【发布时间】:2016-10-24 07:56:57
【问题描述】:

https://stackoverflow.com/a/9868665/433570 找到第一项。

在应用上述解决方案之前,我可以考虑先做reverse。 但是我最终会得到两个reverse,这可能会被避免。

有没有比使用两个reversenext 更好的解决方案?

【问题讨论】:

  • 如果你愿意使用numpy:np.where(np.array(my_list) == criteria_value)[0][-1]

标签: python


【解决方案1】:

我不会反转列表,这可能是一个冗长的操作 (l.reverse()),因为它反转整个列表,我只需使用 reversed iterator @ 987654322@ 使用任何你想要的匹配方法,因为你可以在第一场比赛时提前停止,它可以节省你的时间而不是反转整个列表。

当然,这两种方法都有最好的情况和最坏的情况,下面可能会给你一个想法,根据匹配在列表中的位置(例如接近结尾、开头或中间)

In [1]: l = range(0, 100000)

In [2]: %timeit next((i for i in reversed(l) if i == 1), None)
100 loops, best of 3: 2.94 ms per loop

In [3]: %timeit next((i for i in reversed(l) if i == 50000), None)
1000 loops, best of 3: 1.39 ms per loop

In [4]: %timeit next((i for i in reversed(l) if i == 99000), None)
10000 loops, best of 3: 29.4 µs per loop

以下是反转相同列表需要多长时间的想法:

In [5]: %timeit l.reverse()
10000 loops, best of 3: 71.5 µs per loop

注意:我上面是在 Python 2 上运行的,所以 range() 是一个列表而不是一个迭代器,所以不需要 list(range()) 它来进行比较。

【讨论】:

    【解决方案2】:
    x = range(11)
    y = next((i for i in reversed(x) if i % 2 == 1), None)
    

    【讨论】:

    • 即找出列表中最后一个奇数。
    • 我建议解释一下你在做什么以及为什么,因为你已经为 OP 提供了一种新方法
    【解决方案3】:

    相关问题中接受的答案建议使用列表中的迭代器来构建仅包含匹配元素的生成器并从该生成器中获取第一个元素:

    next(obj for obj in objs if condition)
    

    您可以按相反的顺序使用范围:

    next(objs[i] for i in range(len(objs) -1, -1, -1))
    

    (在 Python2 中使用 xrange

    【讨论】:

      猜你喜欢
      • 2022-01-19
      • 2022-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-09
      • 1970-01-01
      • 2023-03-07
      相关资源
      最近更新 更多