2012-10-01 16 views
10

यदि किसी ऑब्जेक्ट से मेल खाता है तो मैं किसी सूची से तत्व को कैसे हटा सकता हूं?किसी ऑब्जेक्ट से मेल खाने वाली सूची से किसी आइटम को निकालना - पायथन

मैं सूची में से एक तत्व को हटाने pop() और enumerate विधि का उपयोग कर की कोशिश की लेकिन लगता है कि मैं कुछ सन्निहित आइटम कि निकाल दिया जाना चाहिए याद कर रहा हूँ:

sents = ['@$\tthis sentences needs to be removed', 'this doesnt', 
    '@$\tthis sentences also needs to be removed', 
    '@$\tthis sentences must be removed', 'this shouldnt', 
    '# this needs to be removed', 'this isnt', 
    '# this must', 'this musnt'] 

for i, j in enumerate(sents): 
    if j[0:3] == "@$\t": 
    sents.pop(i) 
    continue 
    if j[0] == "#": 
    sents.pop(i) 

for i in sents: 
    print i 

आउटपुट:

this doesnt 
@$ this sentences must be removed 
this shouldnt 
this isnt 
#this should 
this musnt 

वांछित उत्पादन:

this doesnt 
this shouldnt 
this isnt 
this musnt 
+3

उस सूची में आइटम भरने पर आइटम को निकालने का क्लासिक केस। इस से संबंधित अन्य स्टैक ओवरफ़्लो प्रश्नों के दर्जनों पढ़ें। साथ ही, [दस्तावेज़ों में नोट] देखें (http://docs.python.org/reference/compound_stmts.html#for)। –

+1

आपको हमेशा इसके माध्यम से एक कंटेनर की लंबाई बदलने से बचना चाहिए, यह आपदा – wim

+0

के लिए एक नुस्खा है आम तौर पर, जगह में एक सूची को संशोधित करने की कोशिश करने के बजाय आमतौर पर एक नई फ़िल्टर सूची बनाने के लिए बेहतर होता है। अपरिवर्तनीय एल्गोरिदम हमेशा कारणों से आसान होते हैं (हालांकि लिखने के लिए हमेशा आसान नहीं होता है)। जब आप मूल्यों को प्रतिस्थापित कर रहे होते हैं, तो कभी-कभी काम करने की कार्यक्षमता लाभ उस हरा को हराता है, लेकिन जब आप किसी सूची के बीच में हटाना या डालना चाहते हैं, तो आप आमतौर पर अपने कम मजबूत तर्क के साथ _worse_ दक्षता प्राप्त कर रहे हैं। – abarnert

उत्तर

20

गाने abo केन्द्र शासित प्रदेशों के कुछ सरल की तरह:

>>> [x for x in sents if not x.startswith('@$\t') and not x.startswith('#')] 
['this doesnt', 'this shouldnt', 'this isnt', 'this musnt'] 
+0

आह एक सूची समझ, सुरुचिपूर्ण! मुझे कोशिश करने दो। सबसे साफ जवाब के लिए – alvas

+0

+1। – abarnert

8

यह काम करना चाहिए:

[i for i in sents if not ('@$\t' in i or '#' in i)] 

आप केवल चीजें हैं जो निर्दिष्ट उन के साथ शुरू str.startswith(stringOfInterest) विधि

+2

मैं तर्क दूंगा कि सब्सट्रिंग – Frikster

9

एक और तकनीक का उपयोग का उपयोग कर sentential चाहते हैं filter

filter(lambda s: not (s[0:3]=="@$\t" or s[0]=="#"), sents) 

आपके orignal दृष्टिकोण के साथ समस्या एच जब आप सूची आइटम i पर हैं और यह निर्धारित करें कि इसे हटाया जाना चाहिए, तो आप इसे सूची से हटा दें, जो i+1 आइटम को i स्थिति में स्लाइड करता है। लूप का अगला पुनरावृत्ति आप सूचकांक i+1 पर हैं लेकिन आइटम वास्तव में i+2 है।

समझ में आओ?

+0

शुरू होने पर स्पष्टीकरण के लिए धन्यवाद नहीं मानते हैं कि यह एक दूसरे के मुकाबले बेहतर है! गणना करते समय एक सूची पॉपिंग वास्तव में मूर्खतापूर्ण है। हाहाहा .. समस्या का वर्णन करने के लिए – alvas

+0

+1। – abarnert

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