将嵌套listcomprehension转换为常规for循环

2024-09-09 03:58:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道如何使用常规循环编写此列表:

sep_class = [[x for x, t in zip(X_train, y_train) if t==c] for c in np.unique(y_train)]

我这样试过:

sep_class = []
for c in np.unique(y_train):
    for x, t in zip(X_train, y_train):
        if t == c:
            sep_class.append(x)

但结果是不同的。我做错了什么


Tags: in列表forifnptrainzipsep
2条回答
sep_class = []
for c in np.unique(y_train):
    sep_class.append([])
    for x, t in zip(X_train, y_train):
        if t ==c:
            sep_class[c].append(x)

现在它们完全一样了

将列表理解转换为常规循环的最常用方法如下:

l = [f(x) for x in iter]

# converts to:

l = []
for x in iter:
    l.append(f(x))

当您在理解中创建嵌套列表时,这会变得有点复杂,但遵循相同的逻辑,现在f(x)是列表comp本身的翻译。因此,我们:

l = [[g(x) for x in sub] for sub in iter]

# converts to:

l = []
for sub in iter:
    temp = []
    for x in sub:
        temp.append(g(x))
    l.append(temp)

因此,在您的情况下,只需添加条件,列表comp就变成:

sep_class = [[x for x, t in zip(X_train, y_train)if t ==c] for c in np.unique(y_train)]

# converts to:

sep_class = []
for c in np.unique(y_train):
    sub = []
    for x, t in zip(X_train, y_train):
        if t == c:
            sub.append(x)
    sep_class.append(sub)

相关问题 更多 >