切片列表的行为问题

时间:2010-03-18 00:49:22

标签: python function slice

我有一个像

这样的功能
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 :(得分:10)

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

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

答案 1 :(得分:7)

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

  1. f()为您提供了一个列表清单。
  2. [0:2]为您提供一个列表,其中包含列表列表中的前两个元素。由于列表列表中的元素是列表,因此 列表也是
  3. [0:10]为您提供一个列表,其中包含步骤2中生成的列表列表中的前十个元素。
  4. 换句话说,f()[0:2][0:10]以列表列表开头,然后获取该列表列表的子列表(也是列表列表),然后获取第二列表列表的子列表(这也是一个列表清单。)

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

    最重要的是,任何提供所需行为的解决方案都必须在某个时刻访问单个数组元素,如[i],而不是仅使用[i:j]之类的切片。

答案 2 :(得分:0)

pythonic循环将是:

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

但是根据你想要达到的目标,列表理解可能会更好。

或者您使用Pythons map()函数:

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

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

无论如何,没有办法不迭代列表并获得所需的结果。