![](/img/trans.png)
[英]How to sort a list of lists based on the length of the inner lists, but if two inner lists are equal then sort based on first element of inner list
[英]Better way to filter two list of lists by checking length of the inner lists
给定两个列表列表,目标是根据内部列表的长度过滤掉列表。
长度标准由用户设置,即
>>> 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 < len(i) < maxi and mini < len(j) < 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])]
另一种方法是为每种情况返回一个生成器......
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
成为最小长度,在表达式中使用<=
运算符似乎更正确。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.