【问题标题】:Running multiple (i.e. normal and reversed) iterators simultaneously in a "for" loop在“for”循环中同时运行多个(即正常和反向)迭代器
【发布时间】:2017-01-12 04:34:08
【问题描述】:

到目前为止还没有找到令人满意的答案,因此将其作为一个新问题发布。

我必须做到以下几点:

我有一个参数,例如test_num = 5。 现在,在 for 循环的单次迭代中,我希望迭代器同时向前和向后运行。

所以作为输出,我想要这样的东西:

Forward is 0, backward is 5.
Forward is 1, backward is 4.
Forward is 2, backward is 3.
Forward is 3, backward is 2. 
Forward is 4, backward is 1.

我唯一能想到的是:

test_num = 5
for j in range(test_num):
    for i in range(test_num, 0, -1):
        print "Forward is ", i, ", Backward is ", j

但这显然不是正确的方法。使用zip 是唯一的选择吗?因为zip 仅在我使用相同参数或两个参数相等的情况下才有效。我正在寻找足够灵活的东西。

【问题讨论】:

  • “参数相同或两个参数相等”是什么意思? zip 应该可以正常工作。
  • 另外,您的“后向”数字是否是有意的
  • 不清楚你为什么不想要zip,你能用例子解释一下
  • 如果我有两个参数,比如test_num1 = 5test_num2 = 4zip 在第二个迭代器达到 4 时立即停止。
  • @tobias_k:是的,你是对的。 “向后”数字是向前反转并偏移 1。

标签: python for-loop iterator


【解决方案1】:

看起来你的代码很不错,但你只需要 1 个迭代器。

for x in range(5):
    print(str(x)+'_'+str(5-x))

这会给你正确的想法

【讨论】:

    【解决方案2】:

    如果您真的想使用两个迭代器,请尝试使用zip() 函数:

    for i,j in zip(range(5), range(5, 0, -1)):
        print "Forward is {0}, backward is {1}".format(i, j)
    #Forward is 0, backward is 5.
    #Forward is 1, backward is 4.
    #Forward is 2, backward is 3.
    #Forward is 3, backward is 2. 
    #Forward is 4, backward is 1.
    

    但是,您的特定用例似乎很容易使用 1 个迭代器:

    for i in range(5)
        print "Forward is {0}, backward is {1}".format(i, 5-i)
    #Forward is 0, backward is 5.
    #Forward is 1, backward is 4.
    #Forward is 2, backward is 3.
    #Forward is 3, backward is 2. 
    #Forward is 4, backward is 1.
    

    【讨论】:

      【解决方案3】:

      最快的解决方案:

      test_num = 5
      for i in range(test_num):
          print("Forward is %d, backward is %d."%(i, test_num-i))
      

      另一种快速解决方案(如果您不使用test_num-i 表达式,我的解决方案):

      test_num = 5
      for i,j in enumerate(range(test_num,0,-1)):
          print("Forward is %d, backward is %d."%(i, j))
      

      另一种使用 zip 的解决方案(如果你想使用 zip!但速度很慢):

      test_num = 5
      for i,j in zip(range(test_num), range(test_num, 0, -1)):
          print("Forward is %d, backward is %d."%(i, j))
      

      基准测试:

      timeit.timeit('for i in range(5):pass', number=10000) # 0.004307041002903134
      timeit.timeit('for i,j in enumerate(range(5,0,-1)): pass', number=10000) # 0.007563826999103185
      timeit.timeit('for i,j in zip(range(5), range(5, 0, -1)): pass', number=10000) # 0.010275325999828056
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-03
        • 2015-06-06
        • 1970-01-01
        • 2015-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-14
        相关资源
        最近更新 更多