【问题标题】:Previous and next elements in a loop循环中的上一个和下一个元素
【发布时间】:2016-03-06 05:16:23
【问题描述】:

我有一个这样的点列表:

a = [(2,4),(34,53),(34,2),(84,64)]

这些点按顺时针顺序排列,形成一个多边形。我需要找到多边形的周长,这将是相邻点之间距离的总和。我必须使用距离公式来找到距离,所以它必须是(2,4)(34,53) 之间的距离,然后是(34,53)(34,2) 之间的距离等等。

我将如何编写这个 for 循环,它使用距离公式来使用第一个元素和第二个元素的点,然后当移动到第二个和第三个元素等等,最后当它在最后元素,它对最后一个元素和第一个元素使用距离公式..有点像自动换行?

【问题讨论】:

    标签: python list python-3.x for-loop


    【解决方案1】:

    定义多边形周长函数

    import math
    def poly_peri():
    
    a = [(2,4),(34,53),(34,2),(84,64)]
    # Intializing perimeter to be 0
    perimeter = 0
    
    # MAIN LOOP
    #[len(a) - 1] because we dont want to continue after the last number
    for i in range(len(a) - 1):
        distance = ((a[i + 1][0] - a[i][0])**2 + (a[i+1][1] - a[i][1])**2)
    
        perimeter += math.sqrt(distance)
    
    return perimeter
    

    您还可以使用多边形的点列表作为函数 poly_peri(a) 的参数。意思是,当你调用函数 poly_peri() 时,你会称它为 poly_peri([(2,4),(34,53),(34,2),(84,64)])。无论您作为参数输入什么,这都会输出相同的结果。代码如下所示

    import math
    def poly_peri(a):
    
    points = a
    # Intializing perimeter to be 0
    perimeter = 0
    
    # MAIN LOOP
    #[len(points) - 1] because we dont want to continue after the last number
    a.append(a[0])
    for i in range(len(points) - 1):
        distance = ((points[i + 1][0] - points[i][0])**2 + (points[i+1][1] - points[i][1])**2)
    
        perimeter += math.sqrt(distance)
    
    return perimeter
    

    【讨论】:

    • 您的逻辑没有找到 (84,64) 和 (2,4) 之间的距离
    • 你需要在开始循环之前添加a.append(a[0])
    • @Ravichandra 谢谢你告诉我!
    【解决方案2】:

    考虑“负”距离

    import math
    perimeter = 0
    a = [(2,4),(34,53),(34,2),(84,64)]
    
    for i in range(len(a)):
        k = i+1 if (i<len(a)-1) else 0
        x,y = a[i]
        x2,y2 = a[k]
        edge = math.fabs(math.sqrt(math.pow(y2-y, 2) + math.pow(x2-x,2)))
        print("""Edge {}: {}""".format(i,edge))
        perimeter += edge
    
    
    # when run
    Edge 0: 58.52349955359813
    Edge 1: 51.0
    Edge 2: 79.64923100695951
    Edge 3: 101.6070863670443
    >>> print("""Perimeter: {}""".format(perimeter))
    Perimeter: 290.7798169276019
    

    【讨论】:

      【解决方案3】:

      一个更简单的for循环就是:

      >>> for i in range(len(a)):
              print a[i-1], a[i]
      
      
      (84, 64) (2, 4)
      (2, 4) (34, 53)
      (34, 53) (34, 2)
      (34, 2) (84, 64)
      

      【讨论】:

        【解决方案4】:

        使用模除法计算您的指数。例如,如果您有一个长度为 n 的点列表,而 j 是您的索引,那么您可以使用j = (j+1)%n 计算一个环绕索引。

        【讨论】:

          猜你喜欢
          • 2010-09-24
          • 2010-09-24
          • 2011-09-11
          • 1970-01-01
          • 2011-07-03
          • 2016-04-01
          • 1970-01-01
          • 2017-07-15
          • 2016-02-22
          相关资源
          最近更新 更多