1. ホーム
  2. python

[解決済み] 複数の変数を同時に宣言する、よりエレガントな方法

2022-04-27 03:58:35

質問

複数の変数を同時に宣言するにはどうしたらよいですか。

a, b = True, False

しかし、もっと多くの変数を宣言しなければならないとしたら、ますますエレガントではなくなってしまう。

a, b, c, d, e, f, g, h, i, j = True, True, True, True, True, False, True ,True , True, True

もっと良い/エレガントな/便利な方法はないのでしょうか?

これは非常に基本的なことですが、私は変数を格納するためのリストまたはタプルを使用する場合、どのように私は以来、役に立つようにアプローチしなければならないでしょう。

aList = [a,b]

有効ではない、私はしなければならないでしょう。

a, b = True, True

あるいは、何が足りないのでしょうか?

解決方法は?

他の方もおっしゃっていますが、ブール値を持つ10個のローカル変数を使うことが、ルーチンを書くのに最適な方法だとは思えません(特にそれらが本当に一文字の名前である場合は :)。

何をするかによりますが、代わりに辞書を使うのは理にかなっているかもしれません。 たとえば、1文字のフラグのセットに対してブール値のプリセット値を設定したい場合、次のようにすることができます。

>>> flags = dict.fromkeys(["a", "b", "c"], True)
>>> flags.update(dict.fromkeys(["d", "e"], False))
>>> print flags
{'a': True, 'c': True, 'b': True, 'e': False, 'd': False}


お好みであれば、1つの代入文で行うこともできます。

>>> flags = dict(dict.fromkeys(["a", "b", "c"], True),
...              **dict.fromkeys(["d", "e"], False))
>>> print flags
{'a': True, 'c': True, 'b': True, 'e': False, 'd': False}

の2番目のパラメータは dict のようなキーワード引数を使用して、辞書の個々の要素を上書きできるようにするためのものです。 d=False . 上記のコードは、以下の式の結果を吹き飛ばすものです。 ** のセットになります。 キーワード引数 を呼び出し関数に渡します。 これは確かに辞書を作るには信頼できる方法ですし、人々は少なくともこのイディオムを受け入れているようですが、中にはこれをUnpythonicだと考える人もいるのではないでしょうか。 </disclaimer>


もう一つの方法は、このパターンを頻繁に使うのであれば、データをフラグ値のリストとして定義することです ( True , False )をフラグ名(1文字文字列)に対応付ける。 そして、このデータ定義をフラグ名とフラグ値を対応付ける反転辞書に変換する。 これはリスト内包を入れ子にすることで非常に簡潔に行うことができますが、ここでは非常に読みやすい実装を紹介します。

>>> def invert_dict(inverted_dict):
...     elements = inverted_dict.iteritems()
...     for flag_value, flag_names in elements:
...         for flag_name in flag_names:
...             yield flag_name, flag_value
... 
>>> flags = {True: ["a", "b", "c"], False: ["d", "e"]}
>>> flags = dict(invert_dict(flags))
>>> print flags
{'a': True, 'c': True, 'b': True, 'e': False, 'd': False}

機能 invert_dict ジェネレータ機能 . それは が生成します。 または 収量 - という意味で の値を繰り返し返します。 - キー・バリュー・ペアを使用します。 これらのキー・バリュー・ペアは、最初の flags 辞書を使用します。 これらは dict コンストラクタを使用します。 この場合 dict コンストラクタの動作が上記と異なるのは、このコンストラクタには イテレータ は、引数としてディクショナリーではなく


Chris Lutzさんのコメントを引き合いに出して。もし、本当に一文字の値に使うのであれば、次のようにすることができます。

>>> flags = {True: 'abc', False: 'de'}
>>> flags = dict(invert_dict(flags))
>>> print flags
{'a': True, 'c': True, 'b': True, 'e': False, 'd': False}

これは、Pythonの文字列が 反復可能 つまり、値ごとに移動することができる。 文字列の場合、値は文字列内の個々の文字になります。 したがって、文字列が反復子として解釈される場合、この例のようにforループで使用されることになります。 ['a', 'b', 'c']'abc' は実質的に等価です。 他の例としては、イテラブルを受け取る関数に渡される場合です。 tuple .

文字列を見たとき、私はそれがリストとしてではなく、単一の値として使用されることを期待しています。 だから、最初の行を見て、「そうか、TrueフラグとFalseフラグがあるんだ」と思うのです。 逆に、イテラブルとイテレータの概念をより明確に説明するのに役立つかもしれません。


関数の定義 invert_dict ルーチンがどのように動作するかの説明に役立たないので、私はほとんどそうしていません。


Python 2.7には辞書内包があるらしいので、その関数を実装すれば非常に簡潔になるはずです。 私はPython 2.7をインストールしていないので、これは読者への練習として残されています :)

また、常に万能である イターツール モジュールです。 と言われるように やり方はひとつじゃない . 待って、Pythonの人たちはそんなこと言わないよ。 まあ、いずれにせよ、場合によってはそうなんですけどね。 私は、Guidoが私たちに辞書の内包を与えたと推測しています。 一つの明白な方法 を行うことです。