3

我有一个像

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] 切片的列表。

有什么方法可以使第二种形式起作用,还是我每次都必须循环才能获得所需的结果?

4

3 回答 3

10

第二个切片将从第一个切片返回的序列切片,所以是的,您必须以某种方式循环才能在其中切片:

[x[0:10] for x in f()[0:2]]
于 2010-03-18T00:54:45.033 回答
7

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

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

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

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

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

于 2010-03-18T00:55:11.423 回答
0

pythonic循环将是:

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

但是根据您想要实现的目标,列表理解可能会更好。

或者你使用 Pythonsmap()函数:

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

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

一种或另一种方式,没有办法不迭代列表并达到预期的结果。

于 2010-03-18T00:53:07.330 回答