在Python中对列表中的列表进行切片

20

我需要对一个列表的列表进行切片:

A = [[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5]]
idx = slice(0,4)
B = A[:][idx]

这段代码没有给我正确的输出。

我想要的是:[[1,2,3],[1,2,3],[1,2,3]]


1
你在哪里看到你问题中所用到的逻辑?同时,如果 slice(0,4) 确实起作用,为什么会给你每个子列表三个元素? - Padraic Cunningham
6个回答

26

很少情况下,使用切片对象比使用列表推导式更容易阅读,而这不是其中之一。

>>> A = [[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5]]
>>> [sublist[:3] for sublist in A]
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]

这很清晰。对于A中的每个子列表,给我前三个元素的列表。


21

使用NumPy非常简单-您只需要执行切片操作:

In [1]: import numpy as np

In [2]: A = np.array([[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5]])

In [3]: A[:,:3]
Out[3]: 
array([[1, 2, 3],
       [1, 2, 3],
       [1, 2, 3]])

当然,您可以将 numpy.array 转换回 list

In [4]: A[:,:3].tolist()
Out[4]: [[1, 2, 3], [1, 2, 3], [1, 2, 3]]

3
A = [[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5]]

print [a[:3] for a in A]

使用列表生成式

1
您可以使用列表推导式,例如:[x[0:i] for x in A],其中i是1、2、3等,取决于您需要的元素数量。

为什么?他需要每个列表的前idx个元素。 - Sid
@WayneWerner 正确,但我改变了 idx 的意义...现在它是一个原始的整数,而不是一个切片。 - Sid
OP 正在定义 idx = slice(0,4),而不是 4 - Wayne Werner
将 idx 的名称更改为 i。 - Sid

0

要么:

>>> [a[slice(0,3)] for a in A]
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]

或者:

>>> [list(filter(lambda x: x<=3, a)) for a in A]
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]

1
虽然这确实解决了原帖作者的问题,但我怀疑这不是他们想要的。 - Wayne Werner

-1

我是编程新手,Python是我的第一门语言。我学习编程才4到5天。我刚学习了列表和切片,并在寻找一些例子时发现了你的问题并尝试解决它。如果我的代码正确,请予以赞赏。 这是我的代码 A = [[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5]] print(A[0][0:3],A[1][0:3],A[1][0:3])


3
欢迎来到StackOverflow!虽然这会打印出HuckleberryFinn想要的内容,但他希望在不提及A的索引的情况下使用切片对象来处理第二个维度。你的print()函数的第三个参数存在错误。 - greybeard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接