2013-02-13 10 views
13

Chcę dodać kilka zmiennych do listy. Liczba zmiennych jest różna. Wszystkie zmienne zaczynają się od "volume". Myślałem, że może jakiś symbol wieloznaczny czy coś takiego. Ale nie mogłem znaleźć czegoś takiego. Wszelkie pomysły, jak to rozwiązać? Uwaga: w tym przykładzie są to trzy zmienne, ale może to być również pięć lub sześć lub cokolwiek.Dołącz kilka zmiennych do listy w Pythonie

volumeA = 100 
volumeB = 20 
volumeC = 10 

vol = [] 

vol.append(volume*) 
+1

To może pomóc, jeśli mogłoby dać przykład, który jest bliżej do danej sytuacji. Np. W jaki sposób otrzymałeś zmienną liczbę zmiennych, których nazwy nie są znane? –

Odpowiedz

13

Można użyć extend dołączyć dowolny iterable do listy:

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

zależności od prefiksu swoimi nazwami zmiennych ma złe zapachy kodu do mnie ale możesz to zrobić. (Kolejność, w jakiej wartości są dołączane jest niezdefiniowany.)

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

Jeśli kolejność jest istotna (IMHO nadal pachnie źle):

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

Chociaż można zrobić

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

znacznie lepszym rozwiązaniem byłoby użyć słownika zamiast podobnie nazwanych zmiennych:

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

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

pamiętać, że w tym ostatnim przypadku zlecenia pozycji jest nieokreślony, czyli można uzyskać [100,10,20] lub [10,20,100]. Aby dodać elementy w kolejności klawiszy, użyj:

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

+1; jeśli masz kilka zmiennych, których nazwy są w jakiejś sekwencji, prawie na pewno robisz to źle. – geoffspear

+1

Zmienne wynikają z innych obliczeń (których tutaj nie zamieszczałem). Gdybym użył słownika, miałem problem z umieszczeniem ich w słowniku. – ustroetz

3

EDIT usunięte filter z listy ze zrozumieniem, jak to zostało podkreślone, że był to przerażający pomysł.

Zmieniliśmy to, więc nie jest zbyt podobne również dla wszystkich innych odpowiedzi.

volumeA = 100 
volumeB = 20 
volumeC = 10 

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

Wyjście

[100, 10, 20] 
+3

Wywołanie filtra wewnątrz rozumienia sprawia, że ​​jestem smutny ... – JBernardo

+0

Twój komentarz uświadamia mi, jak bardzo się myliłem: D - Uśmiech jutro to walentynki. – sotapme

+0

Jeszcze gorzej jest przełączyć się na używanie 'map' tylko po to, aby nadal używać' filter'. Sądzę, że JBernardo chciał, aby w kompilacjach była wbudowana opcjonalna klauzula if, więc użyj jej zamiast "filter". –

0

chcesz dodać nazwy zmiennych, jak również ich wartości?

output=[] 

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

lub tylko wartości:

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