【问题标题】:Convert a nested list-comprehension to regular for loops将嵌套列表理解转换为常规 for 循环
【发布时间】:2021-02-03 00:20:06
【问题描述】:

我想知道如何用常规循环编写这个列表理解:

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)

但输出不同。我做错了什么?

【问题讨论】:

标签: python list-comprehension


【解决方案1】:
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)

现在它们是相同的。

【讨论】:

  • 但这假设c 的行为类似于for c in range(...)...如果c 在第一次迭代中是2 怎么办?
  • @Tomerikoo 从来没有想过这个......但你说得对,因为我的独特(y_train)只是(0,1,2,3,4,5,6,7,8,9 ) 所以这适用于我的情况。无论如何,这是一个糟糕的问题,我想通了。谢谢。
  • 其实这不是一个坏问题!我在网站上找不到类似的东西,就在今天遇到了类似的问题。所以这实际上是一个可以帮助其他人的好问题 - 你可能问错了......查看我对你的问题的编辑并查看我的答案以及更多解释
【解决方案2】:

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

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

# converts to:

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

当您在推导式中创建嵌套列表时,这会变得有点复杂,但遵循相同的逻辑,现在f(x) 是 list-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)

因此,在您的情况下,只需添加条件,list-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)

【讨论】:

    猜你喜欢
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 2020-03-29
    相关资源
    最近更新 更多