列表中的列表切片行为问题
我有一个这样的函数:
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]
的工作方式如下:
f()
会给你一个包含多个列表的列表。[0:2]
会从这个包含多个列表的列表中取出前两个元素。由于这些元素本身也是列表,所以这也是一个包含多个列表的列表。[0:10]
会从第二步得到的那个包含多个列表的列表中取出前十个元素。
换句话说,f()[0:2][0:10]
是先得到一个包含多个列表的列表,然后从中取出一个子列表(这个子列表也是包含多个列表的列表),接着再从这个子列表中取出另一个子列表(同样也是包含多个列表的列表)。
而 f()[i]
则是直接从你的包含多个列表的列表中提取第 i
个元素,这个元素是一个简单的列表(而不是包含多个列表的列表)。然后,当你对这个简单的列表使用 [0:10]
时,你是对从 f()[i]
得到的简单列表进行操作,而不是对一个包含多个列表的列表进行操作。
总之,任何能达到预期效果的解决方案都必须在某个时刻像 [i]
这样访问单个数组元素,而不是仅仅使用像 [i:j]
这样的切片操作。