簡體   English   中英

Python 字典創建語法

[英]Python dictionary creation syntax

我想知道是否有任何方法可以填充字典,以便您將多個鍵映射到相同的值,這比說的更簡潔:

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

編輯->編輯

我知道這是愚蠢且完全沒有必要的,但我的目標是在一行上進行此聲明。 這顯然不應該僅僅因為它適合 1 行而限制任何響應和編寫代碼是愚蠢的。 但是我正在編寫一個模塊級別的常量字典,如果它是一個單一的襯里會很好。

你可以把它轉過來:

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

怎么樣:

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

代碼高爾夫?

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'}
d = {'READY': 'GPLR2_95',
    95: 'GPLR2_95',
    'CHARGING': 'GPLR3_99',
    'PROTECTION': 'GPLR3_100',
    'CONNECTED': 'GPLR3_101',
    'ERROR':'GPLR3_102'}

將其分成多行(如上)有什么問題? 重點是節省打字還是節省垂直空間? 還有什么?

順便說一句,擁有數字和字符串混合的鍵感覺真的很奇怪。

注意:我將其寫為答案而不是評論,因為我想在多行上顯示格式化代碼。

嘗試遍歷dict項目。

  • 對於 python 2.x

    {key:key 的值,your_dict.iteritems() 中的值}

  • 對於 python 3.x

    {key:key 的值,your_dict.items() 中的值}

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

對於您的情況

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

不是很好,但有效。

這個怎么樣?

d = {
    **{k:'yes' for k in [1,2,3]},
    **{k:'no' for k in [4]}
}

它比公認的答案更簡潔,比倒置字典更直觀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM