2014-08-31 125 views
0

我今天早些時候問過這個問題:Evaluating values within a dictionary for different keys引用嵌套詞典鍵和值的字典內涵

我的工作字典的結構發生了變化,我已經嘗試修改我得到以適應解決方案這個。

結構之前是:

locsOne = {1: [100], 2: [200], 3: [250]} 

,但現在它已被更改爲:

locsone = {1: [[100]], 2: [[200]], 3: [[250]]} 

我嘗試應用在locsOne字典中的haversine公式,拿到鑰匙:價值的到另一個鍵的距離:值,如果它們大於450,則不應將它們包含在結果字典中。

產生的字典應該是這樣的:

locsTwo = {1: {2: 100, 3: 150}, 2: {1: 100, 3: 50}, 3: {1: 150, 2: 50}} 

這是我收到的代碼(感謝falsetru):

for k1 in locsOne: 
    v1 = locsOne[k1][0] 
    locsTwo[k1] = {k2: abs(v1 - locsOne[k2][0]) for k2 in locsOne 
        if k1 != k2 and abs(v1 - locsOne[k2][0]) <= 450} 
print(locsTwo) 

我在修改它返回錯誤,如「IndexError嘗試:列表超出範圍「和」KeyError「。

我最後的修改是:

for k1 in locsOne: 
     v1 = locsOne[k1][1] 
     locsTwo[k1] = {k2: harvesineForm(v1 , locsOne[k2][1]) for k2 in locsOne 
        if k1 != k2 and abs(v1 - locsOne[k2][0]) <= 450} 

任何幫助將不勝感激。

回答

0
a = [[100]] 
print a  # [[100]] 
print a[0] # [100] 
print a[0][0] # 100 

繼假設值總是包含在列表中的單個值,嵌套在一個清單:

locsOne = {1: [[100]], 2: [[200]], 3: [[250]]} 
locsTwo = {} 

for k1 in locsOne: 
    v1 = locsOne[k1][0][0] 
    locsTwo[k1] = {k2: abs(v1 - locsOne[k2][0][0]) for k2 in locsOne 
        if k1 != k2 and abs(v1 - locsOne[k2][0][0]) <= 450} 
print(locsTwo) 

您只需再次訪問列表的第一個值([0])因爲你有更多級別的列表。

+0

如果這些值包含一個座標,例如[-36393612,28623927](就像一個例子),是否有一種方法可以調整您的建議以適應此?我目前正在得到「TypeError:不可用類型:'列表'」。 – 2014-08-31 20:44:08

+0

字典看起來像什麼?'{1:[-1,1]}或'{1:[[-1,1]]}?甚至是「{1:[[-1],[1]]}」?只是爲了確保:當列表包含多個元素時,只會出現錯誤,對嗎? – 2014-08-31 20:48:00

+0

它看起來像這樣:{1:[[ - 6.26373252,54.33636358]],2:[[ - 6.5463247,54.4578952]]} – 2014-08-31 20:52:19