当在内部作用域中使用外部变量时,将嵌套的for循环转换为扁平化的列表理解

时间:2019-03-07 13:41:55

标签: python

我有一对嵌套循环,其中内部循环内部的操作取决于两个循环元素。

def ngram(inp='', mn=2, mx=60):
    """
    EG inp='the' => ['th', 'the', 'he']
    """
    out = []
    for i in range(0, len(inp) + 1 - mn):
        for j in range(i + mn, min(i + mx + 1, len(inp) + 1)):
            out.append(inp[i:j])
    return out

我以为我会把它变成列表理解而不是重复的append,但是我似乎无法弄清楚扩展时如何引用外部i内部j

我要从中得到的东西:

[[i, [j for j in range(i + mn, min(i + mx + 1, len(inp) + 1))]]
    for i in range(0, len(inp) + 1 - mn)]

inp='the' mn=2mx=60何时产生:[[0, [2, 3]], [1, [3]]]

具有生产[inp[0:2], inp[0:3], inp[1:3]]的正确信息

带我去

[[inp[i:j] for j in range(i + mn, min(i + mx + 1, len(inp) + 1))]
    for i in range(0, len(inp) + 1 - mn)]

哪个是:[['th', 'the'], ['he']]

但是应该可以在上面的语句中将其展平,而无需将其包围:

[g for lst in […above…] for g in lst]

可以在前一步以某种方式将其展平吗?

2 个答案:

答案 0 :(得分:3)

您可以这样做:

result = []
for sub_1 in collection:
    for sub_2 in sub_1:
        …
            for sub_n in sub_(n - 1):
                result.append(element)

通常,只要您有以下形式的for循环:

list

您可以构建以下形式的等效[element for sub_1 in collection for sub_2 in sub_1 … for sub_n in sub_(n - 1)] 理解:

.enableReactPreset()

答案 1 :(得分:2)

怎么了?

def ngram(inp='', mn=2, mx=60): 
    return [
        inp[i:j]
        for i in range(0, len(inp) + 1 - mn)
        for j in range(i+mn, min(i + mx + 1, len(inp) + 1))
    ]