【发布时间】:2021-06-23 00:09:10
【问题描述】:
假设我有一个列表:
listOfStuff =([a,b], [c,d], [e,f], [f,g])
我要做的是以类似于以下代码的方式遍历中间2个组件:
for item in listOfStuff(range(2,3))
print item
最终结果应该如下:
[c,d]
[e,f]
这段代码目前不起作用,但我希望你能理解我想要做什么。
【问题讨论】:
假设我有一个列表:
listOfStuff =([a,b], [c,d], [e,f], [f,g])
我要做的是以类似于以下代码的方式遍历中间2个组件:
for item in listOfStuff(range(2,3))
print item
最终结果应该如下:
[c,d]
[e,f]
这段代码目前不起作用,但我希望你能理解我想要做什么。
【问题讨论】:
listOfStuff =([a,b], [c,d], [e,f], [f,g])
for item in listOfStuff[1:3]:
print item
您必须遍历元组的一部分。 1 是您需要的第一个元素,3(实际上是 2+1)是您不需要的第一个元素。
列表中的元素从0开始计数:
listOfStuff =([a,b], [c,d], [e,f], [f,g])
0 1 2 3
[1:3] 采用元素 1 和 2。
【讨论】:
listOfStuff[1:len(listOfStuff)- 1] 或只是listOfStuff[1: -1]。顺便说一句,您是否愿意详细说明您在问题中使用range 的主要原因是什么?谢谢
listOfStuff[1:-1] 忽略最后一个元素。 @ccwhite1:使用listOfStuff[1:]
listOfStuff[1:len(listOfStuff)- 1] 和 listOfStuff[1: -1] 都会给出相同的元素(忽略第一个和最后一个,正如 ccwhite1 恕我直言刚才问的那样)。谢谢
一种更节省内存的迭代列表切片的方法是使用来自itertools 模块的islice():
from itertools import islice
listOfStuff = (['a','b'], ['c','d'], ['e','f'], ['g','h'])
for item in islice(listOfStuff, 1, 3):
print(item)
# ['c', 'd']
# ['e', 'f']
但是,如果范围的起始值很大,这在性能方面可能相对低效,因为islice 在返回项目之前必须遍历第一个起始值为 1 的项目。
【讨论】:
islice(list1, 100000, 100100) 将首先迭代前 99,999 个值(只是不会返回它们)。用 cProfile 自己试试;它也在文档中。
你想使用切片。
for item in listOfStuff[1:3]:
print item
【讨论】:
通过使用iter 内置:
l = [1, 2, 3]
# i is the first item.
i = iter(l)
next(i)
for d in i:
print(d)
【讨论】: