2013-02-13 23 views
13

में किसी सूची में कई चर शामिल करें मैं सूची में कई चर जोड़ना चाहता हूं। चर की संख्या बदलती है। सभी चर "वॉल्यूम" से शुरू होते हैं। मैं शायद एक वाइल्डकार्ड सोच रहा था या कुछ ऐसा करेगा। लेकिन मुझे ऐसा कुछ नहीं मिला। इसे हल करने का कोई उपाय? इस उदाहरण में नोट यह तीन चर है, लेकिन यह पांच या छह या कुछ भी हो सकता है।पायथन

volumeA = 100 
volumeB = 20 
volumeC = 10 

vol = [] 

vol.append(volume*) 
+1

यदि आप एक उदाहरण अपनी स्थिति के करीब है कि दे सकता है यह मदद कर सकता है। यानी, आप चर के चर परिवर्तनीय संख्या के साथ कैसे समाप्त हुए जिनके नाम ज्ञात नहीं हैं? –

उत्तर

13

आप extend उपयोग कर सकते हैं एक सूची के लिए किसी भी iterable संलग्न करने के लिए:

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

अपने चर नाम के उपसर्ग के आधार पर मेरे लिए एक बुरी कोड गंध है, लेकिन आप यह कर सकते हैं। (जिस क्रम में मूल्यों जोड़ दिए जाते हैं अनिर्धारित रहता है।)

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

हैं क्रम महत्वपूर्ण है (IMHO, अभी भी गलत बदबू आ रही है):

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

आप कर सकते हैं हालांकि

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

एक बेहतर दृष्टिकोण इसी तरह-नामित चरों के बजाय एक शब्दकोश का उपयोग करने के होगा:

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

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

ध्यान दें कि बाद के मामले में आदेश आइटमों को निर्दिष्ट नहीं किया गया है, यह है कि आप [100,10,20] या [10,20,100] प्राप्त कर सकते हैं। चाबियों का एक आदेश में आइटम जोड़ने के लिए, का उपयोग करें:

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

+1; यदि आपके पास वेरिएबल्स का एक समूह है जिसका नाम किसी प्रकार के अनुक्रम में हैं, तो आप लगभग निश्चित रूप से गलत कर रहे हैं। – geoffspear

+1

वैरिएबल अन्य गणनाओं से परिणाम (जो मैंने यहां पोस्ट नहीं किया था)। यदि मैं एक शब्दकोश का उपयोग करता हूं तो मुझे पहले उन्हें एक शब्दकोश में रखने की समस्या थी। – ustroetz

3

संपादित सूची समझ से filter हटाया के रूप में यह प्रकाश डाला गया है कि यह एक भयावह विचार था।

मैंने इसे बदल दिया है, इसलिए यह अन्य सभी उत्तरों के समान नहीं है।

volumeA = 100 
volumeB = 20 
volumeC = 10 

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

आउटपुट

[100, 10, 20] 
+3

एक समझ के अंदर एक फ़िल्टर कॉल मुझे दुखी करता है ... – JBernardo

+0

आपकी टिप्पणी मुझे यह समझती है कि मैं कितना गलत था: डी - मुस्कान कल वेलेंटाइन दिवस है। – sotapme

+0

'फ़िल्टर' का उपयोग जारी रखने के लिए बस 'मानचित्र' का उपयोग करने के लिए स्विच करने के लिए भी उलझन में है। मुझे लगता है कि जेबर्नर्डो का मुद्दा यह था कि यदि अंतर्निहित क्लॉज में समझ में पहले से ही एक वैकल्पिक विकल्प है, तो 'फिल्टर' के बजाय इसका उपयोग करें। –

0

आप चर के नाम जोड़ने के साथ-साथ करना चाहते हैं उनके मूल्य?

output=[] 

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

या सिर्फ मान:

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