【问题标题】:Better way to filter two list of lists by checking length of the inner lists通过检查内部列表的长度来过滤两个列表列表的更好方法
【发布时间】:2021-04-19 01:12:12
【问题描述】:

给定两个列表列表,目标是根据内部列表的长度过滤掉列表。

长度标准由用户设置,即

>>> x = [[1,2,3], [1,2,3,4,5,6], [1,2,3,4,5], [1,2,5,6]]
>>> y = [[9,8,7], [9,4,3], [9,4,2], [9,4,2,3]]

>>> mini, maxi = 1, 5 # Accepts inner list length between 1 to 4. 

>>> def my_and_filter(x, y):
...     for i, j in zip(x,y):
...         if mini < len(i) < maxi and mini < len(j) < maxi:
...             yield (i, j)


>>> list(myfilter(x, y))
[([1, 2, 3], [9, 8, 7]), ([1, 2, 5, 6], [9, 4, 2, 3])]

以上内容适用于过滤器需要严格并适用于两个列表的情况。

但还有另一种情况,它只需要应用于其中一个:

>>> def myfilter(x, y):
...     for i, j in zip(x,y):
...         if mini < len(i) < maxi or mini < len(j) < maxi:
...             yield (x, y)
... 

>>> list(myfilter(x, y))
[([1, 2, 3], [9, 8, 7]), ([1, 2, 3, 4, 5, 6], [9, 4, 3]), ([1, 2, 3, 4, 5], [9, 4, 2]), ([1, 2, 5, 6], [9, 4, 2, 3])]

我的问题是

  • 是否可以将这两个运算符结合起来?
  • **有没有更好的方法来写这个条件mini &lt; len(i) &lt; maxi and mini &lt; len(j) &lt; maxi

我尝试将这两个运算符与以下参数结合起来,但我想知道是否有更好的方法:

>>> import operator 

>>> def my_filter(x, y, strict=True):
...     _op = operator.__and__ if strict else operator.__or__
...     for i, j in zip(x,y):
...         if _op(mini < len(i) < maxi, mini < len(j) < maxi):
...             yield (i, j)
... 


>>> list(my_filter(x,y))
[([1, 2, 3], [9, 8, 7]), ([1, 2, 5, 6], [9, 4, 2, 3])]
>>> list(my_filter(x,y, False))
[([1, 2, 3], [9, 8, 7]), ([1, 2, 3, 4, 5, 6], [9, 4, 3]), ([1, 2, 3, 4, 5], [9, 4, 2]), ([1, 2, 5, 6], [9, 4, 2, 3])]

【问题讨论】:

    标签: python list operator-keyword maxlength


    【解决方案1】:

    另一种方法是为每个案例返回一个生成器...

    def myfilter(x, y, min_l, max_l, strict=True):
        if strict:
            return ((i, j) for i, j in zip(x, y) if min_l <= len(i) <= max_l and min_l <= len(j) <= max_l)
        else:
            return ((i, j) for i, j in zip(x, y) if min_l <= len(i) <= max_l or min_l <= len(j) <= max_l)
    

    我不确定您是否希望应用最小长度(?)如果您希望 mini 成为最小长度,在表达式中使用 &lt;= 运算符似乎更正确.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-11
      • 2019-07-20
      • 2017-11-02
      • 1970-01-01
      相关资源
      最近更新 更多