【问题标题】:Python: List comprehension to assign different valuesPython:列表理解以分配不同的值
【发布时间】:2009-10-05 23:45:02
【问题描述】:

我正在制作一个 2D 列表,我想用列表理解对其进行初始化。我希望它做这样的事情:

[[x for i in range(3) if j <= 1: x=1 else x=2] for j in range(3)]

所以它应该返回类似:

[[1,1,1],
 [1,1,1],
 [2,2,2]]

我该怎么做?

感谢您的帮助。

【问题讨论】:

    标签: python list-comprehension


    【解决方案1】:

    您似乎正在寻找这样的东西:

    [[1 if j <= 1 else 2 for i in range(3)] for j in range(3)]
    

    Python conditional expression 与您使用 C 或 Java 之类的语言时可能习惯的有点不同:

    表达式x if C else y首先计算C不是x);如果 C 为真,则评估 x 并返回其值;否则,评估 y 并返回其值。

    做同样事情的稍微短一点的方法是:

    [[1 if j <= 1 else 2]*3 for j in range(3)]
    

    【讨论】:

    • 这很好,因为我可以通过更改范围的大小和更改条件语句轻松扩展。谢谢!
    【解决方案2】:

    Greg 的回答是正确的,尽管产生您想要的结果的更简单和更快的表达式是

    [[j] * 3 for j in (1, 1, 2)]
    

    即,请记住 for 不必仅适用于 range;-),存在列表乘法,等等;-)。

    【讨论】:

    • 这是否允许表仍然是可变的?假设我想将 [0][0] 更改为 10,那会更改任何其他值吗?
    • @Casey — 不,它不会更改任何其他值。
    • @Casey,@Ben 是正确的,每个子列表都是一个不同的对象(因为它们是在列表理解中创建的)。
    【解决方案3】:

    试试看

    >>> [[(1 if j<1 else 2) for i in range(3)] for j in range(3)]
    [[1, 1, 1], [2, 2, 2], [2, 2, 2]]
    

    第二次 j=1 所以 j

    【讨论】:

      猜你喜欢
      • 2020-09-28
      • 2016-01-15
      • 1970-01-01
      • 2022-08-08
      • 1970-01-01
      • 2014-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多