2010-01-14 16 views
5

चलो कहते हैं कि मैं एक बहुआयामी सूची एल करते हैं:फ़िल्टर सरणी ख़ास कॉलम में एक विशिष्ट मूल्य के साथ पंक्तियों को दिखाने के लिए

l = [['a', 1],['b', 2],['c', 3],['a', 4]] 

और मैं है कि 'एक' में केवल पंक्तियों से मिलकर एक और सूची वापस करना चाहते उनकी पहली सूची तत्व:

m = [['a', 1],['a', 4]] 

ऐसा करने का एक अच्छा और कारगर तरीका क्या है?

m = filter(lambda x: x[0] == 'a', l) 

या एक सूची समझ के रूप में:

m = [x for x in l where x[0] == 'a'] 

उत्तर

11

निश्चित रूप से एक सूची समझ के लिए एक केस:

m = [row for row in l if 'a' in row[0]] 

यहाँ मैं अपने " 'एक' में पहला तत्व होने" का शाब्दिक, ले रहा हूँ in ऑपरेटर के उपयोग जिस कारण से। आप "होने 'एक' के रूप में पहला तत्व" (! क्या आप वास्तव में लिखा से एक बहुत अलग बात -) को यह प्रतिबंधित करने के लिए चाहते हैं, तो

m = [row for row in l if 'a' == row[0]] 

;-) इसे और अधिक की तरह है।

0
filter समारोह के साथ

m = filter(lambda x: x[0] == 'a', l) 

मुझे संदेह है कि इनके बीच का अंतर महत्वपूर्ण प्रदर्शन-वार होगा। जो भी सबसे सुविधाजनक है का प्रयोग करें। मुझे lambda एस पसंद नहीं है, लेकिन को itertools.ifilter के साथ बड़ी सूचियों के लिए प्रतिस्थापित किया जा सकता है यदि यह कोई समस्या है, लेकिन आप एक सामान्य जनरेटर को प्राप्त करने के लिए जनरेटर को सूची समझ भी बदल सकते हैं ([]() में बदलें)। इसके अलावा, वे शायद समान हैं।

0

क्या सिर्फ गलत क्या है:

m = [i for i in l if i[0] == 'a'] 

या:

संबंधित मुद्दे

 संबंधित मुद्दे