2016-07-11 11 views
1

Ich habe das Gefühl, dass diese Lösung übertrieben ist und ich die Builtins möglicherweise nicht korrekt verwende.Anwendung auf mehrere Variablen anwenden

Kann jemand eine bessere Möglichkeit vorschlagen, dieselbe Operation auf eine Liste von Variablen anzuwenden?

EDIT - Oder sie ändern, ohne die Werte neu zuweisen (wenn das möglich ist)

size = 150 
free = 27 
used = 123 

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

'[i * 1024 für i in my_vars]' - die Ausführlichkeit kommt hier nur so ziemlich aus der Tatsache, dass das einzelne Variablen sind, anstelle einer Liste oder eines Diktats. – deceze

+0

Sie können 'int' nicht ändern: Sie sind unveränderlich, also müssen Sie sie neu zuweisen. Aber Sie können das leicht optimieren: 'size, free, used = map (Lambda x: x * 1024, (Größe, frei, gebraucht))' –

+0

Was ist los mit 'size = 150 * 1024; frei = 27 * 1024; verwendet = 123 * 1024'? – chepner

Antwort

1

Sie können das "splat" -Entpacken verwenden, um die Elemente einer Liste oder eines Tupels an den NamedTuple-Konstruktor zu übergeben. ZB

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) 

Ausgang

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

Dies wird auch mit einem Generator Ausdruck arbeitet:

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

Und hier ist eine dict Version, die "double-Klecks" Operator ** :

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

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

ich wahrscheinlich ein Verständnis/Generator Ausdruck anstatt list, map und lambda verwenden würden:

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

Das heißt, wenn es wirklich vorteilhaft ist, diese drei Namen als eigenständige Entitäten (anstatt einer einzelnen Liste/Tupel/numpy Array von Elementen) zu haben, sind Sie vielleicht besser dran, alles zu schreiben ...

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

Es ist auch möglich die '[]' in '() zu ändern ', also erstellen wir keine unnötige Liste (nicht dass es sogar nur mit 3 Elementen zählt). – DeepSpace

+0

@DeepSpace - Das stimmt. Aber es ist eine Liste von 3 Items, so dass die Implikationen für Speicher/Leistung nicht so schwerwiegend sind und meiner Erfahrung nach sind die Leute beim Entpacken von Sequenzen bequemer als beliebige Iterables ... Aber ich denke, es gibt keine bessere Zeit als jetzt, um zu versuchen, sich zu verschieben diese Flut ... – mgilson

+0

die Werte werden danach in einem benannten Tupel eingewickelt, so dass es mehr mit dem Erhalten einer sauberen Lösung für das Ändern der Maßeinheit vor der Rückgabe der Werte zu tun hat. Die erste Lösung wird gut funktionieren – AK47

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

Sie könnten ein paar Kommentare hinzufügen, um die Antwort zu erklären. –

1

könnten Sie einfach Ihre Variablen speichern, die irgendwie wie eine Verbindung scheinen, in einem Tupel oder eine Liste wie folgt:

mv = [1024, 27, 123] 

Dann Gebrauch Liste Verständnis Ihre Transformation für alle gelten sie aus:

mv = [i * 1024 for i in mv] 

Wenn Sie numpy verwenden, können Sie auch eineverwenden 10 und die Transformation auf jedes seiner Elemente anwenden (die es standardmäßig der Fall ist):

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

Allerdings sollten Sie auf jeden Fall numpy Import vermeiden, wenn diese ihre alleinige Verwendung im Code ist.

Verwandte Themen