[解決済み] 複数の変数を同時に宣言する、よりエレガントな方法
質問
複数の変数を同時に宣言するにはどうしたらよいですか。
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が私たちに辞書の内包を与えたと推測しています。 一つの明白な方法 を行うことです。
関連
-
[解決済み】RuntimeWarning: 割り算で無効な値が発生しました。
-
[解決済み】ValueError: xとyは同じサイズでなければならない
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] JavaScriptの変数のスコープとは何ですか?
-
[解決済み] Pythonで型をチェックする標準的な方法は何ですか?
-
[解決済み] 億の相対的輸入
-
[解決済み] Pythonでホームディレクトリを取得するための正しいクロスプラットフォームな方法は何ですか?
-
[解決済み] JavaScriptの配列宣言で「Array()」と「[]」はどう違うのですか?
-
[解決済み] JavaScriptで複数の変数を宣言する
-
[解決済み】Javaで複数の変数を同じ値で初期化する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Python関数の高度な応用を解説
-
風力制御におけるKS原理を深く理解するためのpythonアルゴリズム
-
PythonによるExcelファイルの一括操作の説明
-
Python Pillow Image.save jpg画像圧縮問題
-
PythonでECDSAを実装する方法 知っていますか?
-
[解決済み】"No JSON object could be decoded "よりも良いエラーメッセージを表示する。
-
[解決済み】 AttributeError("'str' object has no attribute 'read'")
-
[解決済み】LogisticRegression: Pythonでsklearnを使用して、未知のラベルタイプ: '連続'を使用しています。
-
[解決済み】 TypeError: += でサポートされていないオペランド型: 'int' および 'list' です。
-
[解決済み] Pythonで複数の変数に同じ値を代入する? リストの動作