【问题标题】:Filter Python 2D Array based on 2nd Element根据第二个元素过滤 Python 2D 数组
【发布时间】:2022-11-04 14:40:49
【问题描述】:

我有一个像这样的python 2D数组:

array = [('aaa', 20), ('bbb', 30), ('ccc', 40), ('ddd', 50)]

我想根据每组中的第二个值过滤这个数组。 例如,我只想保留具有第二项 >= 40

预期输出:

filtered_array =  [('ccc', 40), ('ddd', 50)]

我可以通过循环来实现这一点,但有没有一种优雅的过滤方式?

【问题讨论】:

  • [i for i in array if i[1]>=40]
  • 谢谢,它仍然使用 for 循环。
  • 好吧,我想不出一个合乎逻辑的方法,这将使这成为可能。您需要检查每个元素的第二个元素。如果不遍历每个元素,您如何认为这是可能的?
  • 您有一个元组列表,而不是二维数组。
  • 如果您没有 numpy 数组,为什么要使用 numpy 标签?

标签: python arrays numpy


【解决方案1】:

你可以使用filter,但在后台,它仍然使用循环,因为还有什么?

list(filter(lambda x: x[1] >= 40, array))
#[('ccc', 40), ('ddd', 50)]

或者您可以使用itertools.filterfalse(使用相同的脚注):

list(itertools.filterfalse(lambda x: x[1] < 40, array))
#[('ccc', 40), ('ddd', 50)]

【讨论】:

    【解决方案2】:

    最清晰:

    [x for x in xs if x[1] >= 40]
    

    不太清楚:

    list(filter(lambda x: x[1] >= 40, xs))
    

    Python 级别没有循环:

    def f(xs):
        try:
            x = next(xs)
        except StopIteration:
            return
        if x[1] >= 40:
            yield x
        yield from f(xs)
    
    list(f(iter(xs)))
    

    【讨论】:

    • 哎呀,即使在了解一点 Haskell 之后,我也总是忘记订单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 2022-11-20
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 2013-04-30
    相关资源
    最近更新 更多