【问题标题】:Build list using nested for loops with list comprehension使用带有列表理解的嵌套 for 循环构建列表
【发布时间】:2014-02-09 11:03:15
【问题描述】:

我需要使用列表推导来构建一个列表。这基本上就是它必须做的:

pattern = []
for c in range(3):
    for r in range(3):
        if r == c:
            pattern.append(a)
        else:
            pattern.append(b)

但这一切都需要压缩成一行!我以前从未使用过列表推导,所以请解释一下您的解决方案。

谢谢!

编辑: 如果我希望新列表包含子列表,是否也可以将其放入列表理解中?上面我使用了 3 的范围,所以在生成的列表中,每个子列表都包含 3 个元素,即

pattern = [['a','b','b'],['b','a','b'],['b','b','a']]

【问题讨论】:

    标签: python list nested list-comprehension


    【解决方案1】:

    列表推导式的一般形式可以这样理解

    [(the task to be done) (how long it has to be done)]
    

    我们通常在必须完成多长时间部分使用for循环,要完成的任务部分也可以有if条件。 需要注意的重要一点是,要完成的任务部分应该返回一个有效值(即使None 是一个有效值)。因此,您不能在列表推导中使用任何 Python 语句(return,在 Python 2.x 中为 print 等)。

    现在回答你的第一个问题,

    ['a' if r == c else 'b' for c in range(3) for r in range(3)]
    # ['a', 'b', 'b', 'b', 'a', 'b', 'b', 'b', 'a']
    

    这完全创建了一个列表,正如您在 for 循环版本中显示的那样。

    'a' if r == c else 'b'
    

    这是一样的

    if r == c:
        'a'
    else:
        'b'
    

    首先,将执行for c in range(3) 并生成列表[0, 1, 2],然后在每次迭代时执行for r in range(3) 并生成列表[0, 1, 2]。在r 的每次迭代中,我们上面看到的 if 条件都会被执行,if..else 的结果将被用作正在生成的新列表的元素。

    要回答您的第二个问题,您可以很好地使用列表理解。

    从上面的例子我们的基本理解是,列表推导就是生成一个列表。现在,让我们尝试嵌套列表推导(我们将在待完成的任务部分使用列表推导),像这样

    [['a' if r == c else 'b' for r in range(3)] for c in range(3)]
    # [['a', 'b', 'b'], ['b', 'a', 'b'], ['b', 'b', 'a']]
    

    现在,如果您查看我们的嵌套列表理解,首先将执行 for c in range(3),然后将执行 ['a' if r == c else 'b' for r in range(3)] 部分,这将生成嵌套列表的各个行。这里需要注意的重要一点是,c 在嵌套列表理解中可用。

    【讨论】:

    • 可以说我希望我的列表由子列表组成,我将范围设置为 3,因此每个子列表中有 3 个元素。这也可以放入列表理解中吗?
    • @HayleyvanWaas 您能否将这个问题也包括在实际问题中,并通过示例输入和输出进行解释?
    猜你喜欢
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 2021-02-13
    • 1970-01-01
    • 2019-03-12
    相关资源
    最近更新 更多