2012-04-12 112 views
29

我對我想要製作的字典有疑問。我的目標是有多個鍵到單個值,如下所示:如何使用多個鍵將字典制作爲一個值?

dictionary = {('a', 'b'): 1, ('c', 'd'): 2} 
assert dictionary['a'] == 1 
assert dictionary['b'] == 1 

任何想法?

+3

你的意思是說你想用_e'a'或'b''訪問第一個條目嗎?像'dictionary ['a']'和'dictionary ['b']'都返回'1'? – 2012-04-12 12:50:18

+0

就像你說的,字典['a'] = 1和字典['b'] = 1。 – GiannisIordanou 2012-04-12 13:52:29

+0

@evil_inside,啊,如果這就是你想要的,爲什麼你不把1分配給兩個鍵? – senderle 2012-04-12 13:58:50

回答

-1

你的代碼只是工作:

In [1]: mydict ={('a','b'):1,('c','d'):2} 

In [2]: mydict 
Out[2]: {('a', 'b'): 1, ('c', 'd'): 2} 

In [3]: mydict['a', 'b'] 
Out[3]: 1 

In [4]: mydict[('a', 'b')] 
Out[4]: 1 

注意上面的代碼是用Python 2.7.8執行。

+0

它有點作品: >>> mydict ['a '] 回溯(最近呼叫的最後一個): 文件「」,第1行,在 KeyError:'a' – JosephSlote 2014-08-12 22:08:36

+6

不,這不起作用。他的代碼使用元組('a','b')作爲存儲值1的鍵,而不是字符串'a'和'b'作爲單獨的鍵。 – sage88 2015-08-17 17:11:08

+0

@ sage88使用Python 2.7.8在shell中嘗試了'mydict [('a','b')]'',它可以工作。編輯和更新的答案,以避免任何誤解。請重新考慮你的投票。 – 2015-08-17 21:22:58

21

我猜你的意思是這樣的:

class Value: 
    def __init__(self, v=None): 
     self.v = v 

v1 = Value(1) 
v2 = Value(2) 

d = {'a': v1, 'b': v1, 'c': v2, 'd': v2} 
d['a'].v += 1 

d['b'].v == 2 # True 
  • Python的字符串和數字不變對象,
  • 所以,如果你想d['a']d['b']指向相同的值說「更新「,使其值指代易變的對象(用戶定義的類如上,或者dictlistset)。
  • 然後,當您修改對象d['a']時,d['b']同時發生更改,因爲它們都指向相同的對象。
+0

您不必使用不可變對象,只需使用相同變量(對該對象的引用)賦值即可,並且對於可變對象和不可變對象e都會得到相同的結果。g'num = 2'而不是直接對象('num'是變量,'2'是對象)。您可以使用'is'關鍵字來測試它,如下所示:'如果d ['a']是d ['b']:'。如果兩個鍵都指向相同的對象,則表達式將爲「真」 – Yomi 2018-01-15 02:33:28

2

您的示例使用fromkeys創建多個鍵值對。如果你不想要這個,你可以使用一個鍵併爲該鍵創建一個別名。例如,如果您正在使用寄存器映射,則您的密鑰可以是寄存器地址,別名可以是寄存器名稱。這樣你可以在正確的寄存器上執行讀/寫操作。

>>> mydict = {} 
>>> mydict[(1,2)] = [30, 20] 
>>> alias1 = (1,2) 
>>> print mydict[alias1] 
[30, 20] 
>>> mydict[(1,3)] = [30, 30] 
>>> print mydict 
{(1, 2): [30, 20], (1, 3): [30, 30]} 
>>> alias1 in mydict 
True 
3

如果你將要加入到這個字典中經常你想要採取基於類的方法,類似於@ LATTY的東西在這個回答質疑2d-dictionary-with-many-keys-that-will-return-the-same-value

但是,如果您有一個靜態字典,並且您只需要通過多個鍵訪問值,那麼您可以使用兩個字典的簡單途徑。一個用於存儲別名鍵關聯,一個用於存儲你的實際數據:

alias = { 
    'a': 'id1', 
    'b': 'id1', 
    'c': 'id2', 
    'd': 'id2' 
} 

dict = { 
    'id1': 1, 
    'id2': 2 
} 

dict[alias['a']] 

如果您需要添加到字典中,你可以寫這樣的功能使用兩個字典:

def add(key, id, value=None) 
    if id in dict: 
     if key in alias: 
      # Do nothing 
      pass 
     else: 
      alias[key] = id 
    else: 
     dict[id] = value 
     alias[key] = id 

add('e', 'id2') 
add('f', 'id3', 3) 

雖然這是有效的,我想最終如果你想做這樣的事情,寫你自己的數據結構可能是一種方式,儘管它可以使用類似的結構。

0

這很簡單。你必須首先理解Python解釋器的設計。它不會爲所有變量分配內存,如果有任何兩個或更多變量具有相同的值,則它只映射到該值。

讓我們去的代碼示例中,

In [6]: a = 10 

In [7]: id(a) 
Out[7]: 10914656 

In [8]: b = 10 

In [9]: id(b) 
Out[9]: 10914656 

In [10]: c = 11 

In [11]: id(c) 
Out[11]: 10914688 

In [12]: d = 21 

In [13]: id(d) 
Out[13]: 10915008 

In [14]: e = 11 

In [15]: id(e) 
Out[15]: 10914688 

In [16]: e = 21 

In [17]: id(e) 
Out[17]: 10915008 

In [18]: e is d 
Out[18]: True 
In [19]: e = 30 

In [20]: id(e) 
Out[20]: 10915296 

從上面的輸出,變量a和b共享相同的存儲器,c和d具有不同的存儲器,當我創建一個新的變量e和存儲一個值( 11),它已經存在於變量c中,因此它映射到該存儲單元,並且當我將變量e中存在的值更改爲變量d中存在的值時,不會創建新的存儲器,因此現在變量d和e共享相同的內存位置。最後,我將變量e中的值更改爲30,該值未存儲在任何其他變量中,因此它爲e創建了一個新的內存。

所以任何具有相同值的變量共享內存。

Not for list and dictionary objects

讓我們來談談你的問題。

當多個鍵具有相同的值,那麼所有共享相同的內存,所以你期望的東西已經在python中。

可以簡單地使用它像這樣

In [49]: dictionary = { 
    ...:  'k1':1, 
    ...:  'k2':1, 
    ...:  'k3':2, 
    ...:  'k4':2} 
    ...:  
    ...:  

In [50]: id(dictionary['k1']) 
Out[50]: 10914368 

In [51]: id(dictionary['k2']) 
Out[51]: 10914368 

In [52]: id(dictionary['k3']) 
Out[52]: 10914400 

In [53]: id(dictionary['k4']) 
Out[53]: 10914400 

從上面的輸出,被映射到相同的地址的關鍵k1和k2,這意味着僅存儲一次在存儲器中的值其中之一是多個關鍵單值字典這是你想要的東西。 :P

相關問題