是否可以一次为字典对象的多个键赋相同的值?

101 投票
8 回答
150873 浏览
提问于 2025-04-15 23:33

在Python中,我需要一个字典对象,长得像这样:

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

我已经成功地通过结合使用 dict.update()dict.fromkeys() 函数来实现这一点,代码如下:

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

不过,因为这个代码是给初学者写的,他们可能偶尔需要添加键和值,所以我更希望能用一种简单的、像Perl那样的语法,比如:

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?

8 个回答

14

你的第一个例子可以用一个循环来简化:

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

没有什么特别的语法或者技巧,我想不出还有什么会更容易理解的了。

关于你的第二个问题,没有简单又高效的方法来进行查找,就像你第二个例子那样。我只能想到遍历所有的键(元组),然后检查这个键是否在其中,但这并不是你想要的。还是用一个简单的字典,包含你需要的键吧。

总的来说,如果你希望代码能让初学者理解,最好还是坚持使用一些基础的东西,比如条件判断和for/while循环。

69

跟@SilentGhost说的差不多,但我更喜欢一种更明确的写法(适用于Python 3.5及以上版本):

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

我觉得你现在的代码非常简单,你可以稍微改进一下,变成:

my_dict = dict.fromkeys(['a', 'c', 'd'], 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

当然,这样做会返回第一个找到的值,也就是包含给定元素的键。

撰写回答