如何将这一行for循环更改为正常for循环?

时间:2017-08-29 13:14:02

标签: python for-loop

这是一个我无法理解的一般性问题。

如果我有这个:

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)

但我不确定这是否正确,因为我没有在我的代码的其他部分得到预期的结果。

6 个答案:

答案 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)

要展开嵌套理解,请按以下步骤操作:

  1. 首先创建一个空容器:somelist = []
  2. 如果理解中有if条款,请将其放在for
  3. 之后
  4. 然后,从最里面的
  5. 开始,展开嵌套的理解

    内心理解是:

    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])