2016-12-23 53 views
1

我有4個人都在不同的位置。我想這些應該是列表中的元組?如何評估Python中的列表中的元組?

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

人1對x=5y=0,如果你認爲這是一個2D網格等

有在(8,4)

我已經創建了一個計算代碼一輛車去哪個人通過首先拆分x和y座標,將這些列表放在列表中,然後循環遍歷該列表以計算每個的成本,該車最接近:

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

但是,工作,我想不首先分割座標,並逐一評估列表中的元組,但將它們作爲一個整體對待。我該怎麼做呢?

我希望這是明確的! 在此先感謝:-)

回答

1

你可以簡單地解開元組,同時遍歷列表:

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

謝謝!它確實有效!但是,我現在想讓汽車接近最近的人。這意味着新的協調測試應該是(8,3)這是如何工作的?我沒有得到進一步的思考比:nearestperson = cost.index(min(cost))car [0] = x [closestperson] car [1] = y [closestperson],這不起作用,我猜應該有一個更簡單的方法來做到這一點? – dv58585

2

你可以考慮使用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]]) 
0

複數是僞裝的有序對。

people = [5, 4+3j, 5+2j, 8+3j] 
car = 8+4j 
costs = [abs(car - person) for person in people] 
1
>>> 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) 
+0

注意:這實際上是計算笛卡爾平面上的距離,而OP是在x和y方向上的距離總和。 +1閱讀OP所說的內容,而不是OP的內容。 – Will

+0

有趣!我現在可以追加'最接近'到我創建的路由列表。但是,在運行腳本時,起始位置不再被視爲元組。我首先使用route = [car] route = list(itertools.chain(* route1))來清除列表中的列表,但現在它也擺脫了括號。當運行腳本時,我會得到答案:[1,2,(),(),()]其中括號很好地具有最近位置的正確順序。 – dv58585

+0

我不完全明白。如果這是一個不同的問題,你介意更新你的問題嗎? –

0

如果你不想導入其他庫(比如numpy的),你不想做無謂的操作(如power然後平方根),只是爲了計算距離,你可以用enumerate做到在普通的Python:

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]) 

這種方式,你也有指標,而不僅僅是值,如果你需要在以後進行其他操作。