2010-06-04 41 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

相关问题