Python字典创建语法

时间:2011-05-31 18:11:01

标签: python syntax dictionary

我想知道是否有任何方法可以填充字典,以便您有多个键映射到相同的值,而不是说:

d = {1:'yes', 2:'yes', 3:'yes', 4:'no'}

我正在考虑以下几点:

d = {*(1,2,3):'yes', 4:'no'}

这显然是语法错误。

是否有一个相当简单的方法可以在没有太多混淆的情况下执行此操作? (我不打代码高尔夫,但我也不需要反复写同样的东西。但是,任何与代码高尔夫相关的答案都会受到赞赏,因为代码高尔夫很棒=])。< / p>

修改

我可能选了一个坏榜样。这就是我想要做的事情:

d = {*('READY', 95): 'GPLR2_95', 'CHARGING': 'GPLR3_99', 'PROTECTION': 'GPLR3_100', 'CONNECTED': 'GPLR3_101', 'ERROR':'GPLR3_102'}

我希望这会扩展到:

d = {'READY':'GPLR2_95', 95: 'GPLR2_95', ...}

编辑 - &gt;编辑

我知道这是愚蠢而且完全没必要,但我的目标是在一条线上做出这个宣言。这显然不应该限制任何响应和编写代码只是因为它适合1行是愚蠢的。但是我正在编写一个模块级别的常量字典,如果它是单个衬垫那将会很好。

7 个答案:

答案 0 :(得分:66)

你可以转过来:

>>> d1 = {"yes": [1,2,3], "no": [4]}

然后“反转”那个词典:

>>> d2 = {value:key for key in d1 for value in d1[key]}
>>> d2
{1: 'yes', 2: 'yes', 3: 'yes', 4: 'no'}

答案 1 :(得分:8)

怎么样:

501 $ python
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53) 
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> a = {"q":1}
>>> print a
{'q': 1}
>>> a["q"]
1
>>> a["r"] = a["s"] = a["t"] = 2
>>> a
{'q': 1, 's': 2, 'r': 2, 't': 2}
>>> 

答案 2 :(得分:2)

代码高尔夫?

yesindices = [1,2,3,22,34,33]
noindices = [4,8,9]
dict (zip(yesindices, ['yes' for i in yesindices]) + zip(noindices, ['no' for i in noindices]))

产量

{1: 'yes', 2: 'yes', 3: 'yes', 4: 'no', 33: 'yes', 8: 'no', 9: 'no', 34: 'yes', 22: 'yes'}

答案 3 :(得分:2)

d = {'READY': 'GPLR2_95',
    95: 'GPLR2_95',
    'CHARGING': 'GPLR3_99',
    'PROTECTION': 'GPLR3_100',
    'CONNECTED': 'GPLR3_101',
    'ERROR':'GPLR3_102'}

将其分成多行(如上所述)有什么问题?点保存打字还是保存垂直空间?还有别的吗?

顺便说一句,拥有数字和字符串混合的键真的很奇怪。

注意:我把它写成答案而非评论,因为我想在多行显示格式化代码。

答案 4 :(得分:1)

对于你的情况

dict([(_, 'yes') for _ in range(1,4)], **{4:'no'})

如果您需要'yes''no'

的多个键
>>> from itertools import chain
>>> dict(chain([(_, 'yes') for _ in range(1,4)], [(_, 'no') for _ in range(4, 10)]))
{1: 'yes', 2: 'yes', 3: 'yes', 4: 'no', 5: 'no', 6: 'no', 7: 'no', 8: 'no', 9: 'no'}

不太好,但有效。

答案 5 :(得分:0)

dict((x, {4: 'no'}.get(x, 'yes')) for x in range(1, 5))

或3.x:

{x: {4: 'no'}.get(x, 'yes') for x in range(1, 5)}

答案 6 :(得分:0)

尝试遍历字典项。

  • 对于python 2.x

{key: value for key, value in your_dict.iteritems()}

  • 对于python 3.x

{key: value for key, value in your_dict.items()}