2010-06-04 69 views
26

在Python,我需要一個字典對象,它看起來像:是否可以一次爲字典對象中的多個鍵分配相同的值?

{'a': 10, 'b': 20, 'c': 10, 'd': 10, 'e': 20} 

我已經能夠通過結合dict.update()dict.fromkeys()功能,像這樣順利地拿到這樣的:

myDict = {} 
myDict.update(dict.fromkeys(['a', 'b', 'c'], 10)) 
myDict.update(dict.fromkeys(['b', 'e'], 20)) 

然而,由於該代碼正在爲新手用戶編寫,他們可能需要添加鍵/值,我傾向於使用簡單的基本類(Perl-like)語法,如:

myDict = {} 
myDict['a', 'c', 'd'] = 10 
myDict['b', 'e'] = 20 

然而,這給了我:

myDict = {('a', 'c', 'd'): 10, ('b', 'e'): 20} 

有沒有一種方法,我可以簡化我的第一個例子(使用dict.update()dict.fromkeys())進一步,得到我要找的字典對象?

或者,如果我有第二個例子中的元組字典,是否有一種簡單的方法可以讓我執行查找,如myDict['c']myDict.get('c')並獲得值10?

回答

36

我會說你有什麼是非常簡單,你可以稍微改善它是:

my_dict = dict.fromkeys(['a', 'b', 'c'], 10) 
my_dict.update(dict.fromkeys(['b', 'e'], 20)) 

如果你的密鑰元組,你可以這樣做:

>>> my_dict = {('a', 'c', 'd'): 10, ('b', 'e'): 20} 
>>> next(v for k, v in my_dict.items() if 'c' in k)  # use .iteritems() python-2.x 
10 

這是,當然會返回第一個遇到的值,其中包含給定元素的鍵。

+3

的OP說的代碼被用於初學者編寫的,這是比較困難的去領會新手。 – taleinat 2010-06-04 12:41:09

+8

@teleinat:寫一個他們可以使用的函數。你是否正在低估我,因爲我的代碼不夠愚蠢?我的代碼使用內置的方法和函數。那不是基礎知識?如果他們不想從中學習,爲新手編寫代碼有什麼意義? – SilentGhost 2010-06-04 12:42:22

+1

OP顯然知道如何用Python編程。我將他的問題解釋爲他的用例是否有一個更簡單的內置解決方案,而不是可以編寫這樣的函數,還是用複雜的代碼實現他想要的內容。因此,據我瞭解,SilentGhost的迴應並不回答這個問題,所以我低估了它。我最初的評論沒有描述我的降級理由。 – taleinat 2010-06-04 13:30:03

5

你的第一個例子可以使用循環被簡化:

myDict = {} 
for key in ['a', 'c', 'd']: 
    myDict[key] = 10 
for key in ['b', 'e']: 
    myDict[key] = 20 

沒有專門的語法或欺騙,我不能想到的任何事情會更容易理解。

關於你的第二個問題,在第二個例子中沒有簡單而有效的查找方法。我只能想到遍歷鍵(元組),並檢查鍵是否在任何鍵中,這不是你正在尋找的。堅持使用你想要的鍵的簡單字典。一般情況下,如果你的目標是新手可以理解的代碼,那麼堅持基礎,比如if條件和for/while循環。

6

爲什麼不從字典繼承?

class LazyDict(dict): 
    def keylist(self, keys, value): 
     for key in keys: 
      self[key] = value 

>>> d = LazyDict() 
>>> d.keylist(('a', 'b', 'c'), 10) 
>>> d 
{'a': 10, 'c': 10, 'b': 10} 

但我更喜歡循環液

1

到@SilentGhost但類似一個更聲明語法,我更喜歡:

myDict = { 
    **dict.fromkeys(['a', 'b', 'c'], 10), 
    **dict.fromkeys(['b', 'e'], 20) 
} 
+0

元組方法不適用於myDict.get('c'),這就是問題所在。此方法按預期工作,無需添加代碼即可訪問或定義字典。這應該是檢查的答案。 – rickfoosusa 2017-09-30 00:08:17

相關問題