【问题标题】:How to conditionally skip number of iteration steps in a for loop in python?如何有条件地跳过python中for循环中的迭代步骤数?
【发布时间】:2014-02-05 19:21:53
【问题描述】:

我们有一个列表item_list

item_list = ["a", "b", "XYZ", "c", "d", "e", "f", "g"]

我们使用 for 循环遍历其项目,如果项目是 "XYZ",则跳过项目 "c", "d", "e" 并继续使用 "f"

for item in item_list:
    if item == "XYZ":
       do_something()
       skip_3_items() ----> skip items "c", "d", "e"
    else:
        do_something_else()

实现这一目标的最 Pythonic 方式是什么?

【问题讨论】:

  • 您想跳过那些特定的项目或列表中的任何接下来的三个项目?
  • 你可以使用计数器和 continue 直到它为 0,但我很确定最 Pythonic 的方式是完全重新考虑你的循环
  • @jramirez 我想跳过列表中的下 3 个项目
  • 那么kindall的回答会为你做到这一点。

标签: python list for-loop


【解决方案1】:
list_iter = iter(item_list)

for item in list_iter:
    if item == "XYZ":
        do_something()
        for _ in range(3):   # skip next 3 items
            next(list_iter, None)

# etc.

基本上,不是直接迭代列表,而是为它创建一个称为 iterator 的抽象并对其进行迭代。您可以通过调用next(...) 告诉迭代器前进到下一个项目,我们会执行三次以跳过接下来的三个项目。下一次通过循环时,它会在之后的下一个项目上拾取。

【讨论】:

  • next(list_iter) 是做什么的?
  • @alwbtc 它将迭代器前进一位
  • 您应该将这些 next 语句放在 try ... except StopIteration
  • @alwbtc 如果你是迭代器的新手,你应该read this
  • 不要捕获 StopIteration,因为无论如何您都忽略了该值,您可以简单地使用默认 arg,例如next(list_iter, None)
【解决方案2】:

由于没有人提到过while循环,我会:

item_list = ["a", "b", "XYZ", "c", "d", "e", "f", "g"]
i = 0
while i < len(item_list):
    item = item_list[i]
    if item == "XYZ":
        do_something()
        i += 3
    else:
        do_something_else()
    i += 1

【讨论】:

  • 我相信没有人提到过,因为使用 while 通常非常“非 Pythonic”。使用迭代器的全部意义在于避免计算整数和其他东西。你的代码当然可以工作
【解决方案3】:

使用迭代器:

$ cat t.py 
item_list = ["a", "b", "XYZ", "c", "d", "e", "f", "g"]

it = iter(item_list)
for item in it:
    if item == "XYZ":
       print item
       for _ in range(3):
           next(it, None)
    else:
        print item

这给出:

$ python t.py 
a
b
XYZ
f
g

【讨论】:

    【解决方案4】:

    为了便于阅读,我将把它分成两部分处理

    >>> def foo(item_list,key = "XYZ", skip = 3):
        from itertools import takewhile, islice
        def do_something():
            return "do_something()"
        def do_something_else():
            return "do_something_else()"
        it = iter(item_list)
        for items in takewhile(lambda e: e != key, it):
            print items, do_something_else()
        print do_something()
        it = islice(it,skip, None)
        for items in it:
            print items, do_something_else()
    
    
    >>> foo(item_list)
    a do_something_else()
    b do_something_else()
    do_something()
    f do_something_else()
    g do_something_else()
    

    【讨论】:

      【解决方案5】:

      我会存储一个处理跳过项目的计数器。

      def skipper(item_list):
          skip_count = 0
          for item in item_list:
              if item == "XYZ":
                  skip_count = 3
              else:
                  if skip_count:
                      skip_count -= 1
                  else:
                      # do_something()
                      print item,
      

      例子:

      In [23]: item_list
      Out[23]: ['a', 'b', 'XYZ', 'c', 'd', 'e', 'f', 'g']
      
      In [24]: skipper(item_list)
      a b f g
      

      【讨论】:

        【解决方案6】:

        我个人可能会这样写:

        xyz_i = item_list.index('XYZ')
        
        do_something('XYZ') #or do_something(item_list[xyz_i]) but.. just save yourself the list lookup
        
        for x in item_list[xyz_i+4:]:
            do_something_else(x)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-01-30
          • 1970-01-01
          • 2021-08-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多