【问题标题】:Python for loop on two dimensional indexPython for循环二维索引
【发布时间】:2018-03-16 11:44:16
【问题描述】:

这可能是一项简单的任务,但我不确定如何在 Python 中实现。

我在 Python 中的索引上执行了一个 for 循环。我在通过 for 循环循环的每次迭代中定义了一个唯一值。

我想获取 NEXT 或 PREVIOUS for 循环唯一值的值。例如,我有:

counter = 0

for rect in rects:
    randomnumber = random.randint(1,101)
    if counter < len(rects)-1:
        if rects[counter] - rects[counter+1]
            pastrand = {get random value from PREVIOUS loop iteration}
            randsubtract = randomnumber - pastrand

那么我如何从上一个(或下一个)迭代中获取随机数以在 Python 的当前迭代中使用?例如:

  randomnumber in rects[0]
  randomnumber in rects[1]

如何从 for 循环的迭代中调用特定值?

【问题讨论】:

    标签: python arrays for-loop indexing


    【解决方案1】:

    正如所写,您可以在分配新值之前保存上一次循环迭代中的值。

    for ...:
        pastrand = randomnumber
        randomnumber = ...
    

    当然,您必须在循环开始之前为randomnumber 分配一些东西,以便分配在第一次完成。

    另一种方法是循环 对 随机数,而不是每次循环迭代计算一个随机数。为此,您可以使用pairwise() 工具,其实现在itertools documentation 或例如在more-itertools package。循环随机数对可以这样完成:

    for rand1, rand2 in pairwise(repeatfunc(random.randint, None, 1, 101)):
        ...
    

    我使用了另一个迭代工具repeatfunc() 来重复调用randint()。 (您也可以不使用repeatfunc() 来执行此操作。)在此循环的每次迭代中,除了第一次之外,rand1 将等于上一次迭代中的rand2。

    现在,您需要将每个随机数与一个矩形配对(假设这是 rects 中的内容),对吗?您可以使用zip() 来做到这一点。具体来说,zip(random_numbers, rects) 是随机数和矩形元组的迭代器。你可以这样使用它:

    for randomnumber, rect in zip(random_numbers, rects):
        ...
    

    但你会想要迭代对,所以你将 pairwise 与它结合起来:

    for r1, r2 in pairwise(zip(random_numbers, rects)):
        rand1, rect1 = r1
        rand2, rect2 = r2
        ...
    

    这里的random_numbers 可能是我之前对repeatfunc() 所做的事情。这会将一个随机数与每个矩形相关联,并允许您访问每组两个连续的数字/矩形对。

    【讨论】:

      【解决方案2】:

      现在已经很晚了,但这可能对你有用..

      counter = 0
      random =[]
      for rect in rects:
          randomnumber = random.randint(1,101)
          random.append(randomnumber)
          if counter < len(rects)-1:
              if rects[counter] - rects[counter+1]:
              pastrand = random[-1]
              randsubtract = randomnumber - pastrand
      

      【讨论】:

      • 好吧,我肯定已经盯着这种方式太久了——甚至没有发生我可以将当​​前随机数索引到一个以 [counter] 作为迭代的新索引中!谢谢你。这行得通!
      【解决方案3】:

      选项 1
      使用enumerate。如果你想要当前和下一个,你需要迭代直到len(rect) - 1。如果你想要前一个和当前,你需要从 1 开始迭代。

      for i, r in enumerate(rects[:-1]):
          cur = r
          next = rects[i + 1]
      

      或者,

      for i, r in enumerate(rects[1:]):
          prev = rects[-1]
          cur = r
      

      选项 2
      你可以使用zip达到同样的效果:

      for cur, next in zip(rect, rect[1:]):
          ...
      

      【讨论】:

      • 如果超出范围,他将不得不错误处理,对吧?
      • @MikeTung 整个If you want the current and next, you'll need to iterate till len(rect) - 1. If you want the previous and current, you'll need to start iterating from 1.是处理越界的。
      猜你喜欢
      • 2020-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-20
      • 1970-01-01
      • 1970-01-01
      • 2016-12-28
      • 1970-01-01
      相关资源
      最近更新 更多