代码之家  ›  专栏  ›  技术社区  ›  Krish V

在python中访问循环中下一次迭代的索引时索引超出范围

  •  0
  • Krish V  · 技术社区  · 6 年前

    img_files_list = os.listdir(/path/to/directory)
    new_list = []
    for index, img in enumerate(img_files_list):
        if img in new_list:
            continue
        new_list.extend([img, img_files_list[index + 1], img_files_list[index + 2]])
        print(img)
        print(img_files_list[index + 1])
        print(img_files_list[index + 2])
    

    但是当到达循环的末尾时,需要正确地从循环中出来,而不是 索引超出范围异常 . 任何人,请指出我在哪里错过了逻辑。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Luke Sawczak    6 年前

    看起来更像是代码复查而不是堆栈溢出。

    当你到达最后一件物品时 for image, img in enumerate(img_files_list) IndexOutOfRangeException .

    有几种方法可以解决这个问题:

    1. 斯鲁提诉。包括一个条件:

      print(img_files_list[i])
      if i + 1 < len(img_files_list):
          print(img_files_list[i + 1])
      if i + 2 < len(img_files_list):
          print(img_files_list[i + 2])
      
    2. 包括 try... except

      try:
          print(img_files_list[i])
          print(img_files_list[i + 1])
          print(img_files_list[i + 2])
      except IndexOutOfRangeException:
          pass
      
    3. 限制循环的范围:

      i_img = list(enumerate(['a', 'b', 'c', 'd', 'e']))
      for i, img in i_img [:len(i_img ) - 2]:
          print(img)
          print(i_img[i + 1])
          print(i_img[i + 2])
      

    enumerate if img in new_list 你只是用它来跳过下两个。您可以使用range(一种改进的解决方案3)使其更加优雅并解决您的问题。

    imgs = os.listdir('/path/to/directory')
    triplets = []
    for i in range(0, len(imgs) - 2, 3):
        triplet = [imgs[i], imgs[i + 1], imgs[i + 2]]
        triplets.extend(triplet)
        print('\n'.join(triplet))
    

    注意,我不知道你想做什么。甚至你的

    imgs = os.listdir('/path/to/directory')
    print('\n'.join(imgs))
    

    但如果你澄清你想做什么,我可以编辑这个答案。

        2
  •  0
  •   Alperen    6 年前

    index + 1 index + 2 导致最后2项出现问题。为了 当索引为8和9时,您正在尝试执行 img_files_list[10] img_files_list[11] . 所以索引已经失效了 射程。

    我假设您希望以3项列表的形式访问图像,那么我建议您采用一种稍微不同的方式。为了更好地理解,我将使用整数数组而不是图像。

    img_files_list = [0,1,2,3,4,5,6,7,8,9]
    new_list = []  
    n = 3
    for i in range(0, len(img_files_list), n): # Respectively, i is 0,3,6,9,...
        temp = img_files_list[i:i+n]
        print(temp)
        new_list.extend(temp)
    

    [0, 1, 2]
    [3, 4, 5]
    [6, 7, 8]
    [9]