切片列表的行为问题

LtP*_*ack 3 python function slice

我有一个像这样的功能

def f():
    ...
    ...
    return [list1, list2]
Run Code Online (Sandbox Code Playgroud)

这将返回一个列表列表

[[list1.item1,list1.item2,...],[list2.item1,list2.item2,...]]
Run Code Online (Sandbox Code Playgroud)

现在我做以下事情:

for i in range(0,2):print f()[i][0:10]
Run Code Online (Sandbox Code Playgroud)

它工作并打印切片列表

但如果我这样做

print f()[0:2][0:10]
Run Code Online (Sandbox Code Playgroud)

然后它打印忽略[0:10]切片的列表.

有没有办法让第二种形式起作用,或者每次都必须循环以获得所需的结果?

Ign*_*ams 10

第二个切片切片从第一个切片返回的序列,所以是的,你将不得不以某种方式循环以便切片:

[x[0:10] for x in f()[0:2]]
Run Code Online (Sandbox Code Playgroud)


Joe*_*han 7

这两个表现不同的原因是因为这样的f()[0:2][0:10]工作:

  1. f() 为您提供列表清单.
  2. [0:2]为您提供一个列表,其中包含列表列表中的前两个元素.由于列表列表中的元素是列表,因此这也是列表列表.
  3. [0:10] 为您提供一个列表,其中包含步骤2中生成的列表列表中的前十个元素.

换句话说,f()[0:2][0:10]从列表列表开始,然后获取该列表列表的子列表(也是列表列表),然后获取第二列表列表的子列表(也是列表列表) .

相反,f()[i]实际上i从列表列表中提取第-th个元素,这只是一个简单的列表(不是列表列表).然后,当您申请时[0:10],您将其应用于您获得的简单列表,f()[i]而不是列表列表.

最重要的是,任何提供所需行为的解决方案都必须像[i]某些点一样访问单个数组元素,而不是只使用像[i:j].