2013-02-13 17 views
13

Ich möchte mehrere Variablen an eine Liste anhängen. Die Anzahl der Variablen variiert. Alle Variablen beginnen mit "volume". Ich dachte, vielleicht würde eine Wildcard oder etwas es tun. Aber so etwas konnte ich nicht finden. Irgendwelche Ideen, wie man das löst? Beachten Sie, dass es in diesem Beispiel drei Variablen gibt, aber auch fünf oder sechs oder irgendetwas.Mehrere Variablen an eine Liste in Python anhängen

volumeA = 100 
volumeB = 20 
volumeC = 10 

vol = [] 

vol.append(volume*) 
+1

Es könnte helfen, wenn Sie ein Beispiel geben könnte, die auf Ihre Situation näher ist. Also, wie haben Sie eine variable Anzahl von Variablen gefunden, deren Namen nicht bekannt sind? –

Antwort

13

Sie extend jede iterable auf eine Liste anhängen können:

vol.extend((volumeA, volumeB, volumeC)) 

auf dem Präfix Ihrer Variablennamen Je einen schlechten Code Geruch zu mir hat, aber du kannst es tun. (Die Reihenfolge, in der Werte angehängt werden, ist nicht definiert.)

vol.extend(value for name, value in locals().items() if name.startswith('volume')) 

Iforder wichtig ist (IMHO, noch falsch riecht):

vol.extend(value for name, value in sorted(locals().items(), key=lambda item: item[0]) if name.startswith('volume')) 
4

Obwohl Sie

tun
vol = [] 
vol += [val for name, val in globals().items() if name.startswith('volume')] 
# replace globals() with locals() if this is in a function 

ein viel besserer Ansatz wäre ähnlich benannten Variablen statt ein Wörterbuch zu verwenden:

volume = { 
    'A': 100, 
    'B': 20, 
    'C': 10 
} 

vol = [] 
vol += volume.values() 

Beachten Sie, dass im letzteren Fall die Reihenfolge der Artikel ist nicht spezifiziert, das heißt, Sie können [100,10,20] oder [10,20,100] erhalten. So fügen Sie Objekte in einer Reihenfolge von Schlüsseln, verwenden:

vol += [volume[key] for key in sorted(volume)] 
+1

+1; Wenn Sie eine Menge Variablen haben, deren Namen in einer bestimmten Reihenfolge stehen, tun Sie es fast sicher falsch. – geoffspear

+1

Die Variablen ergeben sich aus anderen Berechnungen (die ich hier nicht gepostet habe). Wenn ich ein Wörterbuch benutzen würde, hatte ich das Problem, sie zuerst in ein Wörterbuch zu schreiben. – ustroetz

3

EDIT entfernt filter aus Liste Verständnis, wie es hervorgehoben wurde, dass es eine schreckliche Idee.

Ich habe es geändert, so dass es nicht zu all den anderen Antworten ähnlich ist.

volumeA = 100 
volumeB = 20 
volumeC = 10 

lst = map(lambda x : x[1], filter(lambda x : x[0].startswith('volume'), globals().items())) 
print lst 

Ausgabe

[100, 10, 20] 
+3

ein Filter Anruf in einem Verständnis macht mich traurig ... – JBernardo

+0

Ihr Kommentar macht mir klar, wie falsch ich war: D - Lächeln morgen ist Valentinstag. – sotapme

+0

Es ist noch hässlicher, zu 'map' zu wechseln, nur um' filter' weiter zu verwenden. Ich denke, JBernardos Argumentation bestand darin, dass in Comprehensions bereits eine optionale if-Klausel eingebaut ist, also benutze das anstelle von 'filter'. –

0

tun Sie die Variablennamen als auch hinzufügen möchten als ihre Werte?

output=[] 

output.append([(k,v) for k,v in globals().items() if k.startswith('volume')]) 

oder nur die Werte:

output.append([v for k,v in globals().items() if k.startswith('volume')]) 
Verwandte Themen