枚举是否执行子列表实现?

时间:2016-07-29 11:37:24

标签: python python-3.x

这是:

for i,v in enumerate(lst[from:to]):

或者这个:

for  i,v in enumerate(itertools.islice(lst,from,to)): 

...制作迭代子列表的副本?

1 个答案:

答案 0 :(得分:2)

假设lst是常规Python列表,而不是Numpy数组,Pandas数据帧或某些支持切片索引的自定义类,那么切片[...:...]将创建一个新列表,而{{ 3}}没有。

正如评论中所建议的那样,您可以通过创建enumerate个对象并在使用之前修改原始列表来自行查看:

>>> lst = [1, 2, 3, 4, 5]
>>> e1 = enumerate(lst[1:4])
>>> e2 = enumerate(itertools.islice(lst, 1, 4))
>>> del lst[2]  # remove second element
>>> list(e1)
[(0, 2), (1, 3), (2, 4)]  # shows content of original list
>>> list(e2)
[(0, 2), (1, 4), (2, 5)]  # second element skipped

另请注意,这确实与itertools.islice无关,enumerate将在两种情况下创建生成器(在切片之前创建的任何可迭代之上)。

您还可以创建切片的两个变体并检查其类型:

>>> type(lst[1:4])
list  # a new list
>>> type(itertools.islice(lst, 1, 4))
itertools.islice  # some sort of generator