2017-08-18 25 views
0

给出;为什么在列表理解中没有可变增量

a = [[1,2,3,4], 
    [5,6,7,8], 
    [9,0,1,2], 
    [3,4,5,6]] 

我想得到一个对角线列表 - 使用单个列表理解语句。

[1,6,1,6] 

我的预期,我可以用

i = -1 # (cheating but I didn not know how else to do it) 
dia_1 = [r[i] for (r,i) in [(r, i+1) for r in a]] 

这样做,但我得到的结果;

[1, 5, 9, 3] 

所以,我不能递增:

Q1:为什么没有 '我' 增加?

Q2:如何修复声明以实现渴望的结果?

+0

你希望哪一部分来增加'i'?没有任何任何地方... –

+0

@MadPhysicist;是的 - 当你这样问时,我觉得有点蠢。我想这似乎应该是:) – SteveJ

+0

你不需要我分配使用枚举,而不是..检查我们的答案 –

回答

3

为何不像

dia_1 = [a[n][n] for n in range(len(a))] 

dia_1 = [r[n] for n, r in enumerate(a)] 

虽然第二种方法对我个人来说更美观,但它们会产生相同的结果。无论列表的实际形状如何,都假定n th行具有n th元素。

要回答你关于递增的问题,在你理解的任何地方都没有i的任务。 i + 1具有恒定值0,因此您按预期提取第一列。

+0

我甚至不知道枚举 - 单独是值得我的问题有点愚蠢的感觉。谢谢。 – SteveJ

+0

你问一个合理的问题,你会学到一些新的东西。不要担心,感觉很愚蠢,只是意味着你学到了一些东西。 –

1

为什么'i'不增量?

因为你从来没有告诉过它。你也不能。

如何修复声明以实现渴望的结果?

完全不同。

[r[e] for e, r in enumerate(a)] 
0

尝试enumerate(a)希望这是你的蚂蚁......

我得到的输出

a = [[1,2,3,4], 
    [5,6,7,8], 
    [9,0,1,2], 
    [3,4,5,6]] 
dia_1 = [r[i] for i,r in enumerate(a)]  
print(dia_1) 

>>>[1, 6, 1, 6] 
+0

为什么你有一个嵌套的理解? –

+0

我只是覆盖OP代码...他尝试迭代我所以用枚举代替 –

+0

请参阅其他两个答案,我正在谈论的一个例子。为什么你认为颠倒枚举元组的顺序是个好主意? –

0

的主对角线可通过以下方式提取:

dia_1 = [a[i][i] for i in range(len(a[0]))] 
+0

为什么不只是'len(a)'?如果'len(a)== 0'呢? –

+0

如果len(a)== 0你总是可以捕获异常,但我看到这个缺点。在这种情况下使用枚举要好得多,在这种情况下,dia_1 = [r [i] for i,r in enumerate(a)]' –

+0

@ SteveJ'i = -1 dia_1 = [r [i]在[(r,i + 1)for r in a]]'中获得数组的第一列。如果你想得到不同的列,你可以使用 'c = 2 dia_1 = [r [i]在[(r,i + c)中为r, –

相关问题