Python

2013-02-13 7 views
13

'daki bir listeye birkaç değişken ekleyin Bir listeye birkaç değişken eklemek istiyorum. Değişkenlerin sayısı değişir. Tüm değişkenler "hacim" ile başlar. Belki bir joker gibi düşünüyordum ya da bir şeyler yapardı. Ama böyle bir şey bulamadım. Bunun nasıl çözüleceğine dair bir fikrin var mı? Bu örnekte not üç değişkendir, ancak aynı zamanda beş veya altı veya herhangi bir şey olabilir.Python

volumeA = 100 
volumeB = 20 
volumeC = 10 

vol = [] 

vol.append(volume*) 
+1

durumunuza daha yakın bir örnek verebilir ona iyi gelebilir. I.e, isimleri bilinmeyen değişken bir değişken sayısıyla nasıl sonuçlandınız? –

cevap

13

Çıktı:

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

sizin değişken isimlerin öneki bana kötü bir kod koku gelmiştir bağlı olarak, Ama sen bunu yapabilirsin. (Değerler eklenir sırası tanımlanmamıştır.)

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

düzen (IMHO, hala yanlış kokuyor) önemli ise:

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

Yapabileceğiniz rağmen

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

çok daha iyi bir yaklaşım benzer adlı değişkenlerin yerine bir sözlük kullanmak olacaktır:

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

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

Not olduğu ikinci durumda amacıyla öğelerin belirtilmemiş, yani [100,10,20] veya [10,20,100] alabilirsiniz. , Anahtarların bir sırayla öğeler eklemek için kullanın: o korkunç fikri olduğunu vurgulandı olarak

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

+1; Eğer isimleri bir çeşit dizide olan bir grup değişkeniniz varsa, neredeyse kesinlikle yanlış yapıyorsunuz demektir. – geoffspear

+1

Değişkenler diğer hesaplamalar sonucu ortaya çıktı (burada göndermedim). Bir sözlük kullanacak olsaydım, önce onları bir sözlüğe koymam sorunum vardı. – ustroetz

3

DÜZENLEME liste anlama gelen filter kaldırıldı.

Değiştirdim, bu yüzden diğer tüm cevaplara çok benzemiyor.

volumeA = 100 
volumeB = 20 
volumeC = 10 

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

Bir listeye herhangi iterable eklemek için extend kullanabilirsiniz

[100, 10, 20] 
+3

Bir anlama içinde bir filtre çağrısı beni üzüyor ... – JBernardo

+0

Yorumun ne kadar yanlış olduğumu fark etmemi sağlıyor: D - Smile yarın Sevgililer Günü. – sotapme

+0

Sadece 'filter' kullanmaya devam etmek için' map' kullanmaya geçmek bile daha çirkin. Bence JBernardo'nun anlamı, anlamaların zaten opsiyonel bir içeriğe sahip olması, yani 'filtre' yerine kullanmaktır. –

0

Eğer değişkenler adlar eklemek yanı sıra istiyorsun onların değerleri?

output=[] 

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

ya da sadece değerler:

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