2012-11-23 114 views
18

我的問題屬於字典鍵。我想爲任何單個對象設置一個包含3個鍵的字典。鑰匙必須按順序排列,並且可以有各種各樣的值。例如,Python複雜字典鍵

dictionary = {(key1,key2,key3) : object} 

KEY1可以是1個到10 KEY2之間的任何值可以是11和20 KEY3之間的任何值可以是任何值21和30

在其中鍵的順序之間

放置很重要。

更具體地說,我的鑰匙對應的範圍X,Y,其中許多對象在左右浮動ž笛卡爾座標。我希望能夠進行排序基於了他們的X,Y的物體的相對位置, z位置。

有沒有什麼辦法可以設置它,還是我需要採取不同的方法? 感謝您的幫助!

+0

應該是可能的,我想。你爲什麼不嘗試? – nhahtdh

+0

看起來你的例子就是你應該嘗試的。只要將元組設爲鍵 – jdi

+2

請注意字典實際上是您想要的,因爲它意味着沒有兩個對象可以具有完全相同的xyz位置(因爲每個鍵只保存一個值)。如果你有一個包含x,y和z字段的對象列表,你可以按照'sortedByZ = sorted(objects,key = lambda obj:obj.z)'的方式對它進行排序。 –

回答

11

當然可以,併爲此創造一個字符串鍵 - 只需合併字符串結果你的鑰匙像 '' 連接([K1,K2,K3])

Read more about dictionaries.

字典由鍵索引,可以是任何不可變類型; 字符串和數字始終可以是鍵。如果 它們只包含字符串,數字或元組,則元組可以用作鍵;如果元組直接或間接包含任何可變對象,則不能將其用作 鍵。不能使用列表作爲鍵,因爲鏈表可以使用 索引分配,切片分配,或像append() 和延伸()被修改。

所以你試圖使用元組作爲一個鍵,這是行。

請注意,python中的字典沒有排序。你可以使用collections.OrderedDict。還要建立正確的排序使用sort/sorted functions與指定的參數鍵排序你想要的方式。

編輯的樣本:

from itertools import product 
myDict = {} 
for x,y,z in product(range(10), range(10,20), range(20,30)): 
    myDict[(x,y,z)] = sum([x,y,z]) 
+0

好的,這是有幫助的。這需要處理訂單問題。但我想使用一個對象的x,y,z座標作爲關鍵字,以獲得對存儲在我的字典中的另一種不同類型的對象的訪問。我不知道如何啓用將被接受的每個鍵的各種值。這有意義嗎? – user1846529

+0

@ user1846529你需要爲我們提供一個關鍵輸入樣例和你需要的東西 - 對我而言,你所說的一切看起來都不錯,應該可以工作 –

+0

我的密鑰看起來像這樣(1.8,12.3,24.9),並且必須有一個將爲密鑰的每個部分接受的一系列值。所以(1,12,24)也將滿足關鍵標準或(2,13,25)也可以工作... – user1846529

3

希望你會發現這很有用。

>>> from math import sqrt 
>>> def dist(p1, p2): 
...  x1, y1, z1 = p1 
...  x2, y2, z2 = p2 
...  xd = x1 - x2 
...  yd = y1 - y2 
...  zd = z1 - z2 
...  return sqrt((xd ** 2 + yd ** 2 + zd ** 2)) 
>>> myPoint = (0,0,0) 
>>> class MyObject: pass 
>>> myDict = {(1,2,3):MyObject(), (4,5,6):MyObject()} 
>>> sorted([dist(myPoint, point) for point in myDict]) 
10: [3.7416573867739413, 8.774964387392123] 
1

在我看來,你想從鍵(有序三元組)映射到值(對象)可能無序的集合。如果是這樣的話,它很容易使一個複合鍵出一個有序三元的:

假設obj0是在X,Y,Z座標(10,20,30)obj1是在X,Y,Z座標(11,21,31)。然後:

myObjects = {(10,20,30): obj0, 
      (11,21,31): obj1 
      } 

這工作,因爲這兩個tuple S和int s爲不可變的類型

希望幫助

+0

這很接近,但是我希望對象能夠爲鍵的每個部分接受各種各樣的值。例如,密鑰的第一部分可以接受範圍從1到100的任何值,第二部分可以接受100到200之間的任何值。我不知道如何做到這一點... – user1846529

+0

您可以輕鬆地做' (101,208,35):obj1}'。您是否在尋找能夠在插入新密鑰時檢查範圍的內容? – inspectorG4dget

+0

當我插入新密鑰時,我希望字典知道插入的值在與字典中存儲的對象相對應的特定範圍內。 – user1846529