我有一个像
这样的功能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]切片。
有没有办法让第二种形式起作用,或者每次都必须循环以获得所需的结果?
答案 0 :(得分:10)
第二个切片切片从第一个切片返回的序列,所以是的,你将不得不以某种方式循环以便切片:
[x[0:10] for x in f()[0:2]]
答案 1 :(得分:7)
这两个行为不同的原因是因为f()[0:2][0:10]
的工作原理如下:
f()
为您提供了一个列表清单。[0:2]
为您提供一个列表,其中包含列表列表中的前两个元素。由于列表列表中的元素是列表,因此 列表也是[0:10]
为您提供一个列表,其中包含步骤2中生成的列表列表中的前十个元素。换句话说,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])
无论如何,没有办法不迭代列表并获得所需的结果。