这是一个我无法理解的一般性问题。
如果我有这个:
somelist = [[a for a, b in zip(X, y) if b == c] for c in np.unique(y)]
如何将其写为正常的多行循环?我似乎永远不会做对。
编辑:到目前为止,我已经尝试过了:somelist = []
for c in np.unique(y):
for x, t in zip(X, y):
if t == c:
separated.append(x)
但我不确定这是否正确,因为我没有在我的代码的其他部分得到预期的结果。
答案 0 :(得分:3)
如果有效,请告诉我: 首先为外循环评估外部列表理解。然后评估内部列表理解。
somelist=[]
for c in np.unique(y):
ans=[]
for a,b in zip(X,y):
if b==c:
ans.append(a)
somelist.append(ans)
答案 1 :(得分:2)
要展开嵌套理解,请按以下步骤操作:
somelist = []
if
条款,请将其放在for
内心理解是:
row = []
for a, b in zip(X, y):
if b == c:
row.append(a)
然后,某些列表只是[row for c in np.unique(y)]
,其中row
取决于几个因素。
这相当于:
somelist = []
for c in np.unique(y):
somelist.append(row)
所以完整版本是:
somelist = []
for c in np.unique(y):
row = []
for a, b in zip(X, y):
if b == c:
row.append(a)
c.append(row)
答案 2 :(得分:1)
这看起来如何使用" normal" for-loop(不使用列表推导的a.ka.):
tempdb
答案 3 :(得分:1)
你非常接近。您的方法存在的问题是您忘记了一个重点: 列表推导的结果将是列表 。因此,在内循环中计算的值需要保存在临时列表中,该列表将附加到“主”列表somelist
以创建列表列表:
somelist = []
for c in np.unique(y):
# create a temporary list that will holds the values computed in the
# inner loop.
sublist = []
for x, t in zip(X, y):
if t == c:
sublist.append(x)
# after the list has been computed, add the temporary list to the main
# list `somelist`. That way, a list of lists is created.
somelist.append(sublist)
将列表推导转换为vanilla for循环时的一般经验法则是,对于每个嵌套级别,您将需要另一个嵌套的for
循环和另一个临时列表来保存嵌套中计算的值循环。
作为一个警告,一旦你开始在你的理解中开始超过2-3个嵌套,你应该认真考虑将它垂直于正常的循环。无论你获得什么功效,它都会抵消我对嵌套列表理解的不可靠性。请记住,"97% of the time: premature optimization is the root of all evil. Yet we should not pass up our opportunities in that critical 3%"。
答案 4 :(得分:0)
在提出明显的警告之后,出于性能和Pythonic的原因,你不应该将列表理解扩展为多行循环,你可以从外部编写它:
somelist = []
for c in np.unique(y):
inner_list = []
for a, b in zip(X, y):
if b == c:
inner_list.append(a)
somelist.append(inner_list)
现在你看到了列表理解的美妙。
答案 5 :(得分:0)
somelist = []
for c in np.unique(y):
somelist.append([a for a, b in zip(X, y) if b == c])