列表中的列表切片行为问题

3 投票
3 回答
5416 浏览
提问于 2025-04-15 20:33

我有一个这样的函数:

def f():
    ...
    ...
    return [list1, list2]

这个函数返回的是一个列表的列表。

[[list1.item1,list1.item2,...],[list2.item1,list2.item2,...]]

现在当我这样做的时候:

for i in range(0,2):print f()[i][0:10]

它能正常工作,并且打印出切片后的列表。

但是如果我这样做:

print f()[0:2][0:10]

那么它就会打印出列表,而忽略了[0:10]的切片。

有没有什么办法让第二种方式也能正常工作,还是说我每次都得循环才能得到想要的结果呢?

3 个回答

0

一种符合Python风格的循环写法是:

for list in f()[0:2]:
    print list[0:10]

不过,根据你想要实现的目标,使用列表推导式可能会更好。

或者你可以使用Python的 map() 函数:

def print_sub(x):
    print x[0:10]

map(print_sub, f()[0:2])

无论你选择哪种方式,都必须遍历这个列表才能得到想要的结果。

10

第二个切片是对第一个切片返回的结果进行再次切片,所以是的,你确实需要以某种方式进行循环,才能在里面进行切片:

[x[0:10] for x in f()[0:2]]
7

这两者表现不同的原因是因为 f()[0:2][0:10] 的工作方式如下:

  1. f() 会给你一个包含多个列表的列表。
  2. [0:2] 会从这个包含多个列表的列表中取出前两个元素。由于这些元素本身也是列表,所以这也是一个包含多个列表的列表。
  3. [0:10] 会从第二步得到的那个包含多个列表的列表中取出前十个元素。

换句话说,f()[0:2][0:10] 是先得到一个包含多个列表的列表,然后从中取出一个子列表(这个子列表也是包含多个列表的列表),接着再从这个子列表中取出另一个子列表(同样也是包含多个列表的列表)。

f()[i] 则是直接从你的包含多个列表的列表中提取第 i 个元素,这个元素是一个简单的列表(而不是包含多个列表的列表)。然后,当你对这个简单的列表使用 [0:10] 时,你是对从 f()[i] 得到的简单列表进行操作,而不是对一个包含多个列表的列表进行操作。

总之,任何能达到预期效果的解决方案都必须在某个时刻像 [i] 这样访问单个数组元素,而不是仅仅使用像 [i:j] 这样的切片操作。

撰写回答