web-dev-qa-db-ja.com

Python辞書作成構文

私が言うよりも冗長ではない同じ値にマッピングする複数のキーがあるように辞書を作成する方法があるのだろうかと思います:

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行に収まるという理由だけでコードを記述するのは愚かなことです。しかし、私はそれが単一のライナーだった場合はニースになるモジュールレベルの定数辞書を書いています。

48
Falmarri

あなたはそれを好転させることができます:

>>> 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'}
68
Tim Pietzcker

どうですか:

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

これを複数行に分割することの何が問題になりますか(上記を参照)。ポイントはタイピングを節約していますか、それとも垂直スペースを節約していますか?他に何か?

ところで、数字と文字列が混在したキーを持つのは本当に奇妙に感じます。

注:複数行にフォーマットされたコードを表示したかったので、コメントではなく回答としてこれを書きました。

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

あなたの場合

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

それほど素晴らしいものではありませんが、動作します。

1

Dictアイテムを反復処理してみてください。

  • python 2.x

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

  • python 3.x

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

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