2016-07-11 4 views
1

Я чувствую, что это решение является излишним, и я не могу правильно использовать встроенные функции.Применить операцию к нескольким переменным

Может ли кто-нибудь предложить лучший способ применить ту же операцию к списку переменных?

EDIT - Или изменить их без повторного присвоения значения (если это возможно)

size = 150 
free = 27 
used = 123 

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

'[i * 1024 для i в my_vars]' - многословие здесь в значительной степени связано с тем, что это отдельные переменные, а не список или dict. – deceze

+0

Вы не можете изменить 'int': они неизменяемы, поэтому вам нужно повторно назначить. Но вы можете немного оптимизировать: 'size, free, used = map (lambda x: x * 1024, (размер, бесплатно, используется))' –

+0

Что не так с 'size = 150 * 1024; free = 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

я бы, вероятно, использовать выражение в понимании/генератор, а не list, map и lambda:

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

Сказанное, если это действительно выгодно иметь эти три имени в качестве отдельных объектов (а не один список/набор/набор единиц), возможно, вам лучше всего написать все это ...

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

Также возможно изменить '[]' на '() ', поэтому мы не создаем ненужный список (а не то, что это имеет значение только с тремя элементами.). – DeepSpace

+0

@DeepSpace - Это правда. Но это список из 3-х элементов, поэтому последствия для памяти/производительности не являются серьезными, и, по моему опыту, людям удобнее распаковывать последовательности, чем произвольные итерации ... Но я думаю, что нет лучшего времени, чем сейчас, чтобы попытаться сдвинуть что tide ... – 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, вы можете также использовать np.array и применять преобразование на каждом из его элементов (что он делает по умолчанию):

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

Однако, вы должны определенно избежать импорта numpy если это его единственное применение в вашем коде.