2015-10-24 5 views
-1

Есть ли способ хранить координаты как кортежи или списки в словаре? Я создал словарь, который содержит (расстояние от источника) в качестве ключа и (координаты в x, y) в качестве значений. Но, если я пытаюсь добавить несколько координат на одинаковое расстояние, он перезаписывается.Как хранить списки как значения в списках python defaultdict

Вот мой код до сих пор:

import math 
from collections import defaultdict 
origin_x = 0.0 
origin_y = 0.0 

P = [(0,1),(1,0),(1,0)] 
k = 2 

xmid = float(sum(P[:][0]))/len(P) 

xleft = [x for x in P[:][0] if x <= xmid] 
xright = [x for x in P[:][0] if x > xmid] 

Pleft = [(x,y) for x,y in P[:] if x <= xmid ] 
Pright = [(x,y) for x,y in P[:] if x > xmid] 

print Pleft 

def dist(x1,y1): 
    return math.sqrt((x1-origin_x)**2 + (y1-origin_y)**2) 

worst = [] 
nearest = defaultdict(list) 

for l in xrange(0,len(Pleft)): 
    curr = dist(Pleft[l][0], Pleft[l][1]) 
    print curr 
    if len(nearest) > 1: 
     worst[0] = sorted(nearest.keys())[len(nearest)] 

    if len(nearest) <= k: 
     nearest[curr]= Pleft[l] 
    else: 
     if curr < worst[0]: 
      nearest[curr].append(Pleft[l]) 
     else: 
      break 
    #nearest 
     #best[0] = curr 
     #best[1] = (Pleft[l]) 

for r in xrange(0,len(Pright)): 
    curr = dist(Pright[r][0],Pright[r][1]) 
    if len(nearest) > 1: 
     worst[0] = sorted(nearest.keys())[len(nearest)-1] 
    if len(nearest) <= k: 
     nearest[curr] = Pright[r] 
    else: 
     if curr < worst[0]: 
      nearest[curr].append(Pright[r]) 
     else: 
      break 

print nearest 

Код ниже работы:

>> nearest[2.99].append([2,3]) 

>> nearest 
Out[70]: defaultdict(<type 'list'>, {1.0: [1, 0], 2.0: [1, 2], 4.8: '[3, 1]', 2.99: [[2, 3]]}) 
+0

Является ли это ваш полный код? Что такое P в 6-й строке? – blackmamba

+0

P - это список координат. Наконец, я прочитаю его из файла. Я добавил полный код сейчас. – Tammy

+0

Чтобы предотвратить перезапись, вам нужно изменить 'ближайший [curr] = Pleft [l]' на 'ближайший [curr] .append (Pleft [l])' и аналогично для 'ближайшего [curr] = Pright [r]' , Но я точно не знаю, что вы пытаетесь сделать. Это поможет, если вы объясните, что должен делать ваш код, и какой результат вы ожидаете; посмотрите пожалуйста [mcve]. Ваши 'xleft' и' xright' немного таинственны: я подозреваю, что они не вычисляют то, что вы думаете, но я думаю, это не так уж и сложно, поскольку вы на самом деле не используете 'xleft' или' xright' в любом месте. –

ответ

0

вы можете попробовать этот код? Я в основном внес изменения nearest[curr].append(P[left) вместо nearest[curr] = p[left] ... который заменяет список кортежем ... Также вам не нужно делать x для x в P [:] [0], вы могли бы просто сделать:

x for x in P[0] 

Попробуйте это и дайте мне знать, если это решит вашу проблему ....

from collections import defaultdict 
origin_x = 0.0 
origin_y = 0.0 

P = [(0,1),(1,0),(1,0)] 
k = 2 

xmid = float(sum(P[0]))/len(P) 

xleft = [x for x in P[0] if x <= xmid] 
xright = [x for x in P[0] if x > xmid] 

Pleft = [(x,y) for x,y in P if x <= xmid ] 
Pright = [(x,y) for x,y in P if x > xmid] 

print Pleft 

def dist(x1,y1): 
    import math 
    return math.sqrt((x1-origin_x)**2 + (y1-origin_y)**2) 

worst = [] 
nearest = defaultdict(list) 

for l in xrange(0,len(Pleft)): 
    curr = dist(Pleft[l][0], Pleft[l][1]) 
    print curr 
    if len(nearest) > 1: 
     worst[0] = sorted(nearest.keys())[len(nearest)] 

    if len(nearest) <= k: 
     nearest[curr].append(Pleft[l]) 
    else: 
     if curr < worst[0]: 
      nearest[curr].append(Pleft[l]) 
     else: 
      break 
    #nearest 
     #best[0] = curr 
     #best[1] = (Pleft[l]) 

for r in xrange(0,len(Pright)): 
    curr = dist(Pright[r][0],Pright[r][1]) 
    if len(nearest) > 1: 
     worst[0] = sorted(nearest.keys())[len(nearest)-1] 
    if len(nearest) <= k: 
     nearest[curr].append(Pright[r]) 
    else: 
     if curr < worst[0]: 
      nearest[curr].append(Pright[r]) 
     else: 
      break 

print nearest 
+0

спасибо JTurk. Это было решение. Я переехал его. – Tammy