您的问题本质上需要一个循环。您想为listy 的每个成员做点什么,for 甚至是英文的。
但是,您可以将循环包装在一个理解中,或者调用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]
(或者,当然,上面的其他两种组合,对filter 的理解,或对理解的map。)
您也可以懒惰地进行循环,因此与其浪费时间创建过滤列表,您只需创建将按需生成正值的迭代器:
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 列表的一维数组并在其上调用 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
但无论哪种方式,你仍然有效地循环——而且你很难找到任何认为其中一个更 Pythonic 或更好的人。