【问题标题】:python: iterate a specific range in a listpython:迭代列表中的特定范围
【发布时间】: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]

这段代码目前不起作用,但我希望你能理解我想要做什么。

【问题讨论】:

    标签: python iteration


    【解决方案1】:
    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)] 中的项目执行此操作
    • @ccwhite1:不,您更愿意使用listOfStuff[1:len(listOfStuff)- 1] 或只是listOfStuff[1: -1]。顺便说一句,您是否愿意详细说明您在问题中使用range 的主要原因是什么?谢谢
    • @eat: 不,listOfStuff[1:-1] 忽略最后一个元素。 @ccwhite1:使用listOfStuff[1:]
    • 不,listOfStuff[1:len(listOfStuff)- 1]listOfStuff[1: -1] 都会给出相同的元素(忽略第一个和最后一个,正如 ccwhite1 恕我直言刚才问的那样)。谢谢
    • 我希望 listOfStuff[1:3] 不会在数组的每一步都被评估。
    【解决方案2】:

    一种更节省内存的迭代列表切片的方法是使用来自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 自己试试;它也在文档中。
    • @Jeff:点了...并相应地更新了答案。感谢您的提醒。
    • 如何让islice更高效?
    • @MhmdAdmn:一般来说不可能。
    • 感谢您的回复!我真的很感激
    【解决方案3】:

    你想使用切片。

    for item in listOfStuff[1:3]:
        print item
    

    【讨论】:

    • 哎呀,我从来没有弄错切片索引,当我在命令行中测试它时,我太着急了,以为我得到了正确的结果,而实际上却没有。下次我会编辑它并进行更彻底的测试。
    【解决方案4】:

    通过使用iter 内置:

    l = [1, 2, 3]
    # i is the first item.
    i = iter(l)
    next(i)
    for d in i:
        print(d)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-16
      • 1970-01-01
      • 2019-03-14
      • 2018-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多