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将生成一个名为的调用列表,其结构incoming与outgoing(和例如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)
以上不起作用,有人可以解释为什么失败并给出一个正确的列表理解的例子.
您希望在zip()此处将列表组合成对:
joint = [[x + y for x, y in zip(*row)] for row in zip(outgoing, incoming)]
Run Code Online (Sandbox Code Playgroud)
外环对向上从行outgoing和incoming成对,所以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,而不是副本.您通过对它的不同引用更改了相同的列表.
你需要类似的东西
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(即列表列表)的结构之前分配.你的早期代码是有效的,因为joint是incoming(注意:不是副本,它是对同一对象的引用),所以结构就在那里.
| 归档时间: |
|
| 查看次数: |
173 次 |
| 最近记录: |