2016-07-11 5 views
1

私はこの解決策が過剰であると感じ、組み込み関数を正しく使用していない可能性があります。複数の変数に操作を適用

誰かが同じ操作を変数のリストに適用するより良い方法を提案できますか?

EDIT - または(それが可能の場合)

size = 150 
free = 27 
used = 123 

size, free, used = list(map(lambda x: x * 1024, [size, free, used])) 
+3

'[i * for my_vars]' - ここでの冗長性は、リストや辞書の代わりに個々の変数であるという事実からくるものです。 – deceze

+0

'int'sは変更できません:変更不可能なので、再割り当てする必要があります。しかし、あなたはそれをわずかに最適化することができます: 'size、free、used = map(lambda x:x * 1024、(size、free、used))' –

+0

'size = 150 * 1024;無料= 27 * 1024; used = 123 * 1024'? – chepner

答えて

1

"splat"アンパックを使用すると、リストまたはタプルの項目をNamedTupleコンストラクタに渡すことができます。例えば、

from collections import namedtuple 

TheTuple = namedtuple('TheTuple', ('size', 'free', 'used')) 

size = 150 
free = 27 
used = 123 

t = (size, free, used) 
foo = TheTuple(*[1024 * x for x in t]) 
print(foo) 

出力

TheTuple(size=153600, free=27648, used=125952) 

これもジェネレータ式で動作します: "ダブル・スプラット" を使用して、ここで

foo = TheTuple(*(1024 * x for x in (size, free, used))) 

そしてdictバージョンだオペレータ**

d = dict(
    size = 150, 
    free = 27, 
    used = 123 
) 

foo = TheTuple(**{k: 1024 * v for k, v in d.items()}) 
3

は、私はおそらく理解/ジェネレータ式を使用する値を再割り当てすることなく、それらを変更するのではなくlistmaplambda

size, free, used = (x * 1024 for x in (size, free, used)) 

しかし、もし3つの名前を別々のエンティティ(単一のリスト/タプル/ numpyのアイテムの配列ではなく)にすることが本当に有利なのであれば、すべてを書き出す方が良いかもしれません...

size *= 1024 
free *= 1024 
used *= 1024 
+2

'[]'を '() 'というので、不要なリストを作成することはありません(3つの要素だけでも問題はありません)。 – DeepSpace

+0

@DeepSpace - それは本当です。しかし、それは3つの項目のリストですので、メモリ/パフォーマンスの影響は深刻ではありません。私の経験上、人々は任意のイテラブルよりも快適にアンパックするシーケンスです...しかし、その潮... – mgilson

+0

値は名前付きタプルで後でラップされるので、値を返す前に測定単位を変更するためのきれいな解決策を得ることともっと関係します。最初の解決策はうまくいくでしょう。 – AK47

1
size, free, used=[x*1024 for x in [size, free, used]] 
+1

答えを説明するために少しの解説を追加したいかもしれません。 –

1

あなたは、単にそのようなタプルやリストで、何とか化合物のように見えるあなたの変数を、保存することができます:

mv = [1024, 27, 123] 

を次に、すべてのあなたの変換を適用するために、リストの内包表記を使用します

mv = [i * 1024 for i in mv] 

あなたがnumpyを使用している場合、あなたはまた、を使用することができます。それらの10と(それがデフォルトではない)その要素のそれぞれに変換を適用します。これはあなたのコード内でその唯一の使用であれば

mv = np.array([1024, 27, 123]) 
mv *= 1024 

しかし、あなたは間違いなくnumpyをインポートすることは避けてください。

関連する問題