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

Bil*_*one 44 python syntax dictionary

在Python中,我需要一个字典对象,如下所示:

{'a': 10, 'b': 20, 'c': 10, 'd': 10, 'e': 20}
Run Code Online (Sandbox Code Playgroud)

我已经能够通过组合dict.update()和如下dict.fromkeys()功能成功地获得这个:

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

但是,因为代码是为有时需要添加键/值的新手用户编写的,所以我更喜欢简单的简单(Perl-like)语法,例如:

myDict = {}
myDict['a', 'c', 'd'] = 10
myDict['b', 'e'] = 20
Run Code Online (Sandbox Code Playgroud)

然而,这给了我:

myDict = {('a', 'c', 'd'): 10, ('b', 'e'): 20}
Run Code Online (Sandbox Code Playgroud)

有没有办法可以进一步简化我的第一个例子(使用dict.update()dict.fromkeys()),并获取我正在寻找的dict对象?

或者,或者,如果我在第二个例子中有一个带有元组的字典,那么我是否可以轻松地进行查找,例如myDict['c']myDict.get('c')获取值10?

Sil*_*ost 48

我会说你拥有的简单,你可以稍微改进它:

my_dict = dict.fromkeys(['a', 'b', 'c'], 10)
my_dict.update(dict.fromkeys(['b', 'e'], 20))
Run Code Online (Sandbox Code Playgroud)

如果您的密钥是元组,您可以这样做:

>>> 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
Run Code Online (Sandbox Code Playgroud)

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

  • @teleinat:所以写一个他们可以使用的函数.你认真对待我是因为我的代码不够愚蠢吗?我的代码使用内置方法和函数.那怎么不是基础?如果他们不打算从中学习代码,那么为新手编写代码有什么意义呢? (12认同)
  • OP表示代码是为初学者编写的,对于新手来说这是相对难以理解的. (6认同)
  • @SilentGhost我不同意.我已经用Python编程了九年,但有一段时间我还在学习标准库中的新功能.知道使用一种语言并从内到外了解其整个标准库是非常不同的事情.但是,我不认为我们中的任何一个都会被定罪,所以我们只是同意不同意. (5认同)
  • OP显然知道如何用Python编程.我将他的问题解释为是否有一个更简单的内置解决方案用于他的用例,而不是是否可以编写这样的函数或用复杂的代码实现他想要的东西.因此,据我所知,SilentGhost的回复没有回答这个问题,所以我对它进行了低估.我最初的评论没有描述我的downvoting的原因. (4认同)
  • @SilentGhost:IMO的OP知道如何编程,可能自己想出了一些等同的东西;他在问是否有一个简单的现有机制,例如内置的或在标准库中。 (2认同)

sha*_*.lo 15

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

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

  • 元组方法不适用于myDict.get('c'),这就是问题所在.此方法按预期工作,无需添加代码来访问或定义字典.这应该是经过检查的答案. (3认同)

tal*_*nat 8

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

myDict = {}
for key in ['a', 'c', 'd']:
    myDict[key] = 10
for key in ['b', 'e']:
    myDict[key] = 20
Run Code Online (Sandbox Code Playgroud)

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

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

通常,如果您的目标是新手可以理解的代码,请坚持使用基本知识,例如if条件和for/while循环.


rem*_*osu 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}
Run Code Online (Sandbox Code Playgroud)

但我更喜欢循环解决方案


wja*_*rea 5

字典联合 (3.9+)

现在使用 Python 3.9,您可以执行以下操作:

myDict = dict.fromkeys(['a', 'c', 'd'], 10) | dict.fromkeys(['b', 'e'], 20)
Run Code Online (Sandbox Code Playgroud)

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

字典理解

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

这也很难阅读,但我是为了完整性而提及它。

参考