Python 如何筛选列表中的列表?

Python 如何筛选列表中的列表?,python,list,filter,Python,List,Filter,我有,例如,listy=[[1,-1,2],[3,-2,-4]] 我想进行过滤,以便只得到正元素[[1,2],[3]] 使用循环和过滤器(lambda x:x>0,listy)很容易做到这一点,但我希望避免循环。列表理解可以嵌套: In [2]: [ [i for i in x if i>0] for x in listy ] Out[2]: [[1, 2], [3]] 关于过滤和列表理解之间的选择,列表理解既清晰又快速 过滤器(p,S)几乎总是写得更清楚,如[x代表S中的x如果 P(x

我有,例如,listy=[[1,-1,2],[3,-2,-4]]

我想进行过滤,以便只得到正元素[[1,2],[3]]


使用循环和过滤器(lambda x:x>0,listy)很容易做到这一点,但我希望避免循环。

列表理解可以嵌套:

In [2]: [ [i for i in x if i>0] for x in listy ]
Out[2]: [[1, 2], [3]]
关于
过滤
和列表理解之间的选择,列表理解既清晰又快速

过滤器(p,S)几乎总是写得更清楚,如[x代表S中的x如果 P(x)],这有着最常见用法所具有的巨大优势 涉及用于比较的谓词,例如x==42,并定义 lambda对于读者来说只需要付出更多的努力(加上 lambda比列表速度慢)

高级主题:处理大型数据集 如果
listy
很大且您的应用程序允许,您可能需要使用生成器来代替列表:

g = ( (i for i in x if i>0) for x in listy )

列表理解可以嵌套:

In [2]: [ [i for i in x if i>0] for x in listy ]
Out[2]: [[1, 2], [3]]
关于
过滤
和列表理解之间的选择,列表理解既清晰又快速

过滤器(p,S)几乎总是写得更清楚,如[x代表S中的x如果 P(x)],这有着最常见用法所具有的巨大优势 涉及用于比较的谓词,例如x==42,并定义 lambda对于读者来说只需要付出更多的努力(加上 lambda比列表速度慢)

高级主题:处理大型数据集 如果
listy
很大且您的应用程序允许,您可能需要使用生成器来代替列表:

g = ( (i for i in x if i>0) for x in listy )

你的问题本质上需要一个循环。如果你想为listy的每个成员做点什么,那么的
甚至有英文版本

但是,您可以在理解或调用
map
等中结束循环。例如:

listy = map(lambda sublist: filter(lambda x: x>0, sublist), listy)
listy = [[x for x in sublist if x>0] for sublist in listy]
(当然,也可以是上述两种组合,即对
过滤器的理解,或对理解的
映射。)

您也可以懒散地进行循环,因此,您只需创建迭代器,根据需要生成正值,而不是在创建过滤列表之前浪费时间:

itery = itertools.imap(lambda sublist: itertools.ifilter(lambda x: x>0, sublist), listy)
itery = ((x for x in sublist if x>0) for sublist in listy)
但这只是意味着循环会在稍后发生,当您迭代
itery
的每个元素时,而不是立即发生

(同样,您可以结合上述两种思想,例如,迭代器列表或列表迭代器,而不是迭代器迭代器或列表迭代器列表。)

甚至可以通过创建Python列表的1D数组并在其上调用
vectorize(lambda lst:filter(lambda x:x>0,sublist))
将循环隐藏在NumPy元素操作中。但循环仍然会存在


当然,您也可以通过间接循环绕过循环。例如,对于递归:

def filter_nonpositives(x):
    return x[:x[0]>0] + filter_nonpositives(x[1:])
甚至可以将循环展开到某个最大大小:

def filter_nonpositives(x):
    result = []
    if len(x) == 0:
        return result
    if x[0] > 0:
        result.append(x[0])
    if len(x) == 1:
        return result
    if x[1] > 0:
        result.append(x[1])
    if len(x) == 2:
        return result
    if x[2] > 0:
        result.append(x[2])
    # ... repeat as far as you want
    return result

但不管怎样,你仍然在有效地循环,你很难找到任何一个认为其中一个更像蟒蛇或更好的人。

你的问题本质上需要一个循环。如果你想为listy的每个成员做点什么,那么
甚至有英文版本

但是,您可以在理解或调用
map
等中结束循环。例如:

listy = map(lambda sublist: filter(lambda x: x>0, sublist), listy)
listy = [[x for x in sublist if x>0] for sublist in listy]
(当然,也可以是上述两种组合,即对
过滤器的理解,或对理解的
映射。)

您也可以懒散地进行循环,因此,您只需创建迭代器,根据需要生成正值,而不是在创建过滤列表之前浪费时间:

itery = itertools.imap(lambda sublist: itertools.ifilter(lambda x: x>0, sublist), listy)
itery = ((x for x in sublist if x>0) for sublist in listy)
但这只是意味着循环会在稍后发生,当您迭代
itery
的每个元素时,而不是立即发生

(同样,您可以结合上述两种思想,例如,迭代器列表或列表迭代器,而不是迭代器迭代器或列表迭代器列表。)

甚至可以通过创建Python列表的1D数组并在其上调用
vectorize(lambda lst:filter(lambda x:x>0,sublist))
将循环隐藏在NumPy元素操作中。但循环仍然会存在


当然,您也可以通过间接循环绕过循环。例如,对于递归:

def filter_nonpositives(x):
    return x[:x[0]>0] + filter_nonpositives(x[1:])
甚至可以将循环展开到某个最大大小:

def filter_nonpositives(x):
    result = []
    if len(x) == 0:
        return result
    if x[0] > 0:
        result.append(x[0])
    if len(x) == 1:
        return result
    if x[1] > 0:
        result.append(x[1])
    if len(x) == 2:
        return result
    if x[2] > 0:
        result.append(x[2])
    # ... repeat as far as you want
    return result

但不管怎样,你仍然在有效地循环,你很难找到任何一个认为其中任何一个更像蟒蛇或更好的人。

我不相信没有某种循环的情况下有任何方法可以做到这一点。加1,如果有人知道不同的^^@T.Woody:取决于循环的计数。递归是循环吗?一个循环展开成一堆重复的代码是一个循环吗?我认为答案是“就任何重要的事情而言”,但其他人可能不同意;看看我的答案。我不相信在没有某种循环的情况下,无论如何都会有这样的事情发生。加1,如果有人知道不同的^^@T.Woody:取决于循环的计数。递归是循环吗?一个循环展开成一堆重复的代码是一个循环吗?我认为答案是“就任何重要的事情而言”,但其他人可能不同意;看看我的答案。