是否可以同时为dict对象中的多个键分配相同的值?

时间:2010-06-04 12:23:09

标签: python syntax dictionary

在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()),并获取我正在寻找的dict对象?

或者,或者,如果我在第二个示例中有一个带有元组的词典,那么我是否有一种简单的方法可以进行myDict['c']myDict.get('c')的查找并获得值10?

7 个答案:

答案 0 :(得分:41)

我会说你所拥有的只是非常简单,你可以稍微改进它:

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

当然,这将返回第一个遇到的值,其中包含给定元素的键。

答案 1 :(得分:10)

与@SilentGhost类似,但我更喜欢使用更具声明性的语法:

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

答案 2 :(得分:7)

您可以使用循环简化您的第一个示例:

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

没有专门的语法或技巧,我想不出任何更容易理解的东西。

关于第二个问题,在第二个例子中没有简单有效的方法来进行查找。我只能想到迭代键(元组)并检查键是否在其中任何一个,这不是你想要的。坚持使用你想要的直接字典。

一般情况下,如果您的目标是新手可以理解的代码,请坚持使用条件和for / while循环等基础知识。

答案 3 :(得分:6)

为什么不继承dict?

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}

但我更喜欢循环解决方案

答案 4 :(得分:3)

字典联合 (3.9+)

现在enter image description here,您可以这样做:

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

虽然就我个人而言,我不确定我是否会使用它,因为它很难阅读。

字典理解

myDict = {
    k: v
    for keys, v in [(['a', 'c', 'd'], 10), (['b', 'e'], 20)]
    for k in keys
    }

这也很难读,但我是为了完整起见才提到它。

with Python 3.9

答案 5 :(得分:1)

方法:

def multi_key_dict_get(d, k):
    for keys, v in d.items():
        if k in keys:
            return v
    return None

用法:

my_dict = {
   ('a', 'b', 'c'): 10,
   ('p', 'q', 'r'): 50
}

value = multi_key_dict_get(my_dict, 'a')

答案 6 :(得分:0)

想到一种方法。 仍然只有相同内容的限制。

一个键的值不能更改另一个键。

key_map = {   
    'KEY_UP':move_up,
    'w':'KEY_UP',
}

输入key_map

# loop over the `dict`

if key_map[key] in key_map:
    # one key is the value of the other

    target_key = key_map[key]
    key_map[key] = key_map[target_key]
    # overwrite key white the ontents of the other