Python字典创建语法

Python字典创建语法,python,syntax,dictionary,Python,Syntax,Dictionary,我想知道是否有任何方法可以填充字典,这样您就可以将多个键映射到同一个值,这比说: d = {1:'yes', 2:'yes', 3:'yes', 4:'no'} 我的想法大致如下: d = {*(1,2,3):'yes', 4:'no'} 这显然是一个语法错误 有没有一种合理简单的方法可以做到这一点而不需要太多的混淆?(我不是在玩代码高尔夫,但我也不需要一遍又一遍地写本质上相同的东西。不过,任何与代码高尔夫相关的答案都将受到欢迎,因为代码高尔夫非常棒=]) 编辑: 我可能选择了一个坏例子。这

我想知道是否有任何方法可以填充字典,这样您就可以将多个键映射到同一个值,这比说:

d = {1:'yes', 2:'yes', 3:'yes', 4:'no'}
我的想法大致如下:

d = {*(1,2,3):'yes', 4:'no'}
这显然是一个语法错误

有没有一种合理简单的方法可以做到这一点而不需要太多的混淆?(我不是在玩代码高尔夫,但我也不需要一遍又一遍地写本质上相同的东西。不过,任何与代码高尔夫相关的答案都将受到欢迎,因为代码高尔夫非常棒=])

编辑

我可能选择了一个坏例子。这就是我想做的:

d = {*('READY', 95): 'GPLR2_95', 'CHARGING': 'GPLR3_99', 'PROTECTION': 'GPLR3_100', 'CONNECTED': 'GPLR3_101', 'ERROR':'GPLR3_102'}
我希望它能扩展到:

d = {'READY':'GPLR2_95', 95: 'GPLR2_95', ...}
编辑->编辑

我知道这是愚蠢的,完全没有必要的,但我的目标是在一行上做出这个声明。这显然不应该限制任何响应,仅仅因为它适合一行就编写代码是愚蠢的。但我正在编写一个模块级常量dict,如果它是一个单行程序,那就太好了。

怎么样:

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}
>>> 
或在3.x中:

{x: {4: 'no'}.get(x, 'yes') for x in range(1, 5)}
代码高尔夫

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'}

你可以扭转局面:

>>> 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'}
为了你的案子

dict([(_, 'yes') for _ in range(1,4)], **{4:'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'}
不是很好,但很有效

d = {'READY': 'GPLR2_95',
    95: 'GPLR2_95',
    'CHARGING': 'GPLR3_99',
    'PROTECTION': 'GPLR3_100',
    'CONNECTED': 'GPLR3_101',
    'ERROR':'GPLR3_102'}
把它分成多行(如上所述)有什么不对?该点是节省打字还是节省垂直空间?还有别的吗

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


注意:我写这篇文章是作为回答而不是评论,因为我想在多行上显示格式化的代码。

尝试遍历dict项

  • 对于Python2.x
{key:value for key,您的dict.iteritems()中的值}

  • 对于Python3.x

{key:value for key,value在您的dict.items()中}

显然,
d=collections.defaultdict(lambda:'yes')
不是您要找的?反转您的键也可以…'是的:(1,2,3)@Nix:是的,这只是我的例子。我会更新它,使它更符合我的应用程序。没有必要,只是想确保用一种不同的方式来思考它并没有消除你这样做的需要。哦,为了大声喊叫。编写一个以元组和向量为参数的小函数。编写一个迭代器。看在上帝的份上,写在不止一行上。有一天可能会有人读到这篇文章。正如我所更新的,这些键都是字符串和整数,需要映射到字符串。这是一个很糟糕的例子,因为range()并不完全适用。只需使用正确的序列,而不是调用
range()
。这不是我试图避免的多行。我想这是个过时的术语吧?还是我一直用错了?“我实际上指的是多个语句。”福尔马里在这种情况下,像我展示的那样,在多行上这样做有什么不对?我不是挑剔,我只是想了解你的要求。我喜欢一些代码高尔夫类型的答案。它没有本质上的问题。我只有4-5个键指向相同的值,大约有8或9个值。这就是9*5的字典定义。我只是想找个更紧凑的。你这么做是为了避免重复几次“是”吗?好吧,从代码高尔夫的角度来说,它很可爱,但代码高尔夫也很有害。我同意这不太好。也许很聪明,但不是很漂亮。我的第一个解决方案是一个小助手函数(带有嵌套的、可读的“for”循环)。但他想要一条一行的,所以我给了他一条。并不是说我会在自己的代码中这样做——嵌套的dict理解通常很难阅读。我对可读性的担心并不是嵌套的dict理解,而是对刚刚定义的字典进行反转和转换所造成的混乱。如果我正在阅读代码,我可能会错过反转,或者注意到它并想知道它有什么用途。
d = {'READY': 'GPLR2_95',
    95: 'GPLR2_95',
    'CHARGING': 'GPLR3_99',
    'PROTECTION': 'GPLR3_100',
    'CONNECTED': 'GPLR3_101',
    'ERROR':'GPLR3_102'}