【问题标题】:how to assess tuples in a list in python?如何评估python列表中的元组?
【发布时间】:2016-12-23 14:03:59
【问题描述】:

我有 4 个人都在不同的位置。我想这些应该是列表中的元组?

People=[(5,0),(4,3),(5,2),(8,3)]

Person 1 位于 x=5 和 y=0,如果您将其视为 2D 网格等。

(8,4)有一辆车

我创建了一个代码,通过首先拆分 x 和 y 坐标,将它们放在一个列表中,然后遍历这个列表来计算每个人的成本,来计算汽车离哪个人最近:

for i in range (4):
    cost=abs((xcar-xpeople[i])+(ycar-people[I])

这行得通,但是,我不想先拆分坐标,并一个一个地评估列表中的元组,而是将它们视为一个整体。我该怎么做?

我希望这很清楚! 在此先感谢:-)

【问题讨论】:

    标签: python arrays list tuples


    【解决方案1】:

    您可以考虑使用numpy 库,它使数组操作变得快速而简单:

    >>> import numpy as np
    >>> people=np.array([(5,0),(4,3),(5,2),(8,3)])
    >>> xcar = np.array((8,4))
    >>> abs(people - xcar)
    array([[3, 4],
           [4, 1],
           [3, 2],
           [0, 1]])
    

    【讨论】:

      【解决方案2】:

      您可以在遍历列表时简单地解包元组:

      for x, y in People:
          cost = abs((xcar - x) + (ycar - y))
      

      【讨论】:

      • 谢谢!它确实有效!但是,我现在想让车去接最近的人。这意味着 isstt 的新坐标应该是 (8,3) 它是如何工作的?我没有比想得更远的了:closestperson=cost.index(min(cost)) car[0]=x[closestperson] car[1]=y[closestperson],这行不通,我想应该有更简单的方法吗?
      【解决方案3】:
      >>> People=[(5,0),(4,3),(5,2),(8,3)]
      >>> car=(8,4)
      >>> from math import hypot
      >>> from operator import sub
      
      >>> closest=min(People, key=lambda pos: hypot(*map(sub, pos, car)))
      
      >>> closest
      (8, 3)
      

      【讨论】:

      • 注意:这实际上是计算笛卡尔平面上的距离,而 OP 会计算 x 和 y 方向上的距离之和。 +1 用于阅读 OP 所说的而不是 OP 所做的。
      • 有趣!我现在可以将“最近”附加到我创建的路线列表中。但是,在运行脚本时,开始位置不再被视为元组。我首先使用 route=[car] route=list(itertools.chain(*route1)) 来摆脱列表中的列表,但现在它也摆脱了括号。运行脚本时,我得到答案: [1,2, (), (),()] 其中括号很好地具有最近位置的正确顺序。
      • 我不太明白。如果是其他问题,您介意更新您的问题吗?
      • 亲爱的@Ni。 ,我是新人积极使用stackoverflow,所以我不知道如何更新,因此我创建了一个新问题:stackoverflow.com/questions/41304799/…
      【解决方案4】:

      复数是变相的有序对。

      people = [5, 4+3j, 5+2j, 8+3j]
      car = 8+4j
      costs = [abs(car - person) for person in people]
      

      【讨论】:

        【解决方案5】:

        如果你不想导入额外的库(比如 numpy)并且你不想做不必要的操作(比如power 然后平方根)只是为了计算距离,你可以简单地做Python 与enumerate:

        People=[(5,0),(4,3),(5,2),(17,10),(8,3)]
        car = (8,4)
        
        min_cost = 99999
        min_index = -1
        
        for i, coord in enumerate(People):
            cost = abs(car[0] - coord[0]) + (car[1] - coord[1])
            if (min_cost > cost):
                (min_cost, min_index) = (cost, i)
        
        print(People[min_index])
        

        这样你也有索引,而不仅仅是值,以防你以后需要它进行其他操作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-11-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-15
          相关资源
          最近更新 更多