Python - 使用2 for循环和ADD AND操作数列出理解

Pho*_*nix 6 python list-comprehension list add python-3.x

outgoing=[
        [27, 42, 66, 85, 65, 64, 68, 68, 77, 58],
        [24, 39, 58, 79, 60, 62, 67, 62, 55, 35],
        [3, 3, 8, 6, 5, 2, 1, 6, 22, 23],
        [3, 3, 8, 6, 5, 2, 1, 6, 22, 23],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       ]
incoming=[
        [459, 469, 549, 740, 695, 629, 780, 571, 574, 599],
        [420, 443, 504, 714, 669, 604, 745, 537, 537, 562],
        [39, 26, 45, 26, 26, 25, 35, 34, 37, 37],
        [26, 25, 27, 26, 26, 25, 35, 34, 37, 37],
        [13, 1, 18, 0, 0, 0, 0, 0, 0, 0],
       ]
Run Code Online (Sandbox Code Playgroud)

我想创建一个列表,它是传入+传出的组合.例如incoming[0][0]应该添加outgoing[0][0],incoming[0][1]应该添加outgoing[0][1]等等.joint将生成一个名为的调用列表,其结构incomingoutgoing(和例如10个元素的列表)相同.执行此操作的代码如下:

joint=incoming
for x in range(5):
    for y in range(10):
        joint[x][y]+=outgoing[x][y]
Run Code Online (Sandbox Code Playgroud)

这很好用.但我希望它作为列表理解.

[[joint[x][y]+=outgoing[x][y]] for x in range(5) for y in range(10))]
Run Code Online (Sandbox Code Playgroud)

以上不起作用,有人可以解释为什么失败并给出一个正确的列表理解的例子.

Mar*_*ers 8

您希望在zip()此处将列表组合成对:

joint = [[x + y for x, y in zip(*row)] for row in zip(outgoing, incoming)]
Run Code Online (Sandbox Code Playgroud)

外环对向上从行outgoingincoming成对,所以outgoing[0]连同incoming[0],outgoing[1]与进入的[1]`等

内环然后对向上成对的行,将outgoing[0][0]incoming[0][0]连成一个元组,其次是outgoing[0][1]incoming[0][1],依此类推.内循环产生一行求和值.

演示:

>>> [[x + y for x, y in zip(*row)] for row in zip(outgoing, incoming)]
[[486, 511, 615, 825, 760, 693, 848, 639, 651, 657], [444, 482, 562, 793, 729, 666, 812, 599, 592, 597], [42, 29, 53, 32, 31, 27, 36, 40, 59, 60], [29, 28, 35, 32, 31, 27, 36, 40, 59, 60], [13, 1, 18, 0, 0, 0, 0, 0, 0, 0]]
>>> from pprint import pprint
>>> pprint(_)
[[486, 511, 615, 825, 760, 693, 848, 639, 651, 657],
 [444, 482, 562, 793, 729, 666, 812, 599, 592, 597],
 [42, 29, 53, 32, 31, 27, 36, 40, 59, 60],
 [29, 28, 35, 32, 31, 27, 36, 40, 59, 60],
 [13, 1, 18, 0, 0, 0, 0, 0, 0, 0]]
Run Code Online (Sandbox Code Playgroud)

您的特定代码不起作用,因为您不能在表达式中使用赋值语句(增强或其他).+=代码的一部分不能像那样使用.

另一个问题是,这joint只是另一个参考incoming,而不是副本.您通过对它的不同引用更改了相同的列表.


jon*_*rpe 5

你需要类似的东西

joint = [[sum(x) for x in zip(a, b)] for a, b in zip(incoming, outgoing)]
Run Code Online (Sandbox Code Playgroud)

您尝试的列表推导不起作用,因为它尝试joint[x][y]在设置joint(即列表列表)的结构之前分配.你的早期代码是有效的,因为jointincoming(注意:不是副本,它是对同一对象的引用),所以结构就在那里.