提取2D列表的第一列以及单行中的索引

时间:2018-03-30 17:17:52

标签: python list list-comprehension

你如何将这两个列表理解缩短为一行?我想编码为一行。我的方式似乎太长了。我觉得还有另一种编码方式。

y = [array[i][0] for i in range(len(array))]
x = [i for i in range(len(array))]

x, y = [i for i in range(len(array))], [array[i][0] for i in range(len(array))]

3 个答案:

答案 0 :(得分:6)

假设您想要提取2D列表的第一列及其索引,您可以使用enumerate反向 - zip解包:

array = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
x, y = zip(*enumerate([r[0] for r in array]))

print(x)
(0, 1, 2)

print(y)
(1, 4, 7)

x是索引,y是行向量。如上所示,此方法会导致您的数据被提取为 tuple s (而非list s),并且在array为空时会失败。

所以,正如@ user2357112在他们comment中所说的那样,请不要努力将所有你的代码推到一行 - 只有当它可以完成时才会这样做这样做的意义。

此外,为了扩展评论中的讨论,最好的方法是遵循@Rakesh在answer中所示的两步法:

x = list(range(len(array)))
y = [r[0] for r in array]

print(x)
[0, 1, 2]

print(y)
[1, 4, 7]

这并没有上述缺点。

答案 1 :(得分:2)

这应该有帮助

x = range(len(array))    #range returns  list
y = [i[0] for i in array]    #you can access the element in the list without range or len 

答案 2 :(得分:0)

x, y = list(map(list, zip(*[(i, r[0]) for i, r in enumerate(a)]))) or ([], [])
免责声明:我认为这是一种情况,因为单行是一件坏事。