1) लगभग-अंग्रेजी शैली:
in
ऑपरेटर का उपयोग करके उपस्थिति के लिए परीक्षण करें , फिर remove
विधि लागू करें ।
if thing in some_list: some_list.remove(thing)
remove
विधि का केवल पहली घटना निकाल देंगे thing
, सभी घटनाओं आप उपयोग कर सकते हैं हटाने के लिए while
की बजाय if
।
while thing in some_list: some_list.remove(thing)
- काफी सरल, शायद मेरी पसंद। छोटी सूचियों के लिए (एक-लाइनर्स का विरोध नहीं किया जा सकता)
पायथन में यह शूट-फर्स्ट-आस्क-सवाल-आखिरी रवैया आम है। अग्रिम में परीक्षण के बजाय यदि वस्तु उपयुक्त है, तो बस संचालन करें और प्रासंगिक अपवादों को पकड़ें:
try:
some_list.remove(thing)
except ValueError:
pass # or scream: thing not in some_list!
except AttributeError:
call_security("some_list not quacking like a list!")
निश्चित रूप से ऊपर दिए गए उदाहरण में खंड को छोड़कर दूसरा केवल संदिग्ध हास्य नहीं है, लेकिन पूरी तरह से अनावश्यक है (बिंदु अवधारणा से परिचित नहीं लोगों के लिए बतख-टाइपिंग को चित्रित करना था)।
यदि आप किसी चीज़ के होने की उम्मीद करते हैं:
while True:
try:
some_list.remove(thing)
except ValueError:
break
- इस विशिष्ट उपयोग के मामले के लिए एक छोटी सी क्रिया, लेकिन पायथन में बहुत ही मुहावरेदार।
- यह # 1 से बेहतर प्रदर्शन करता है
- PEP 463 ने सरल उपयोग के लिए प्रयास / सिवाय एक छोटे वाक्यविन्यास का प्रस्ताव रखा जो यहां काम आएगा, लेकिन यह स्वीकृत नहीं था।
हालाँकि, प्रसंग के दमन () के संदर्भ में (अजगर 3.4 में पेश) उपरोक्त कोड इसके लिए सरल हो सकता है:
with suppress(ValueError, AttributeError):
some_list.remove(thing)
फिर, यदि आप किसी चीज़ की कई घटनाओं की अपेक्षा करते हैं:
with suppress(ValueError):
while True:
some_list.remove(thing)
3) कार्यात्मक शैली:
लगभग 1993, अजगर मिला lambda
, reduce()
, filter()
और map()
, एक के सौजन्य से लिस्प हैकर जो उन्हें याद किया और प्रस्तुत काम कर पैच *। आप filter
सूची से तत्वों को निकालने के लिए उपयोग कर सकते हैं :
is_not_thing = lambda x: x is not thing
cleaned_list = filter(is_not_thing, some_list)
एक शॉर्टकट है जो आपके मामले के लिए उपयोगी हो सकता है: यदि आप खाली आइटम (वास्तव में आइटम bool(item) == False
, जैसे None
, शून्य, खाली स्ट्रिंग या अन्य खाली संग्रह) को फ़िल्टर करना चाहते हैं , तो आप पहले तर्क के रूप में कोई भी पास नहीं कर सकते:
cleaned_list = filter(None, some_list)
- [अद्यतन] : पायथन 2.x में, (या यदि पहला तर्क है ) के
filter(function, iterable)
बराबर हुआ करता था ; पायथन 3.x में, यह अब के बराबर है । सूक्ष्म अंतर यह है कि किसी सूची को वापस करने के लिए उपयोग किए जाने वाले फ़िल्टर का उपयोग किया जाता है, अब यह एक जनरेटर अभिव्यक्ति की तरह काम करता है - यह ठीक है यदि आप केवल साफ की गई सूची पर पुनरावृत्ति कर रहे हैं और इसे छोड़ रहे हैं, लेकिन अगर आपको वास्तव में सूची की आवश्यकता है, तो आपको कॉल को संलग्न करना होगा कंस्ट्रक्टर के साथ ।[item for item in iterable if function(item)]
[item for item in iterable if item]
None
(item for item in iterable if function(item))
filter()
list()
- * इन लिस्फी स्वाद वाले निर्माणों को पायथन में थोड़ा विदेशी माना जाता है। 2005 के आसपास, गुइडो यहां तक कि छोड़ने के बारे में बात कर रहे थे
filter
- साथियों के साथ map
और reduce
(वे अभी तक नहीं गए हैं, लेकिन फंक्शनलबूल मॉड्यूल reduce
में ले जाया गया था , जो एक नज़र के लायक है यदि आप उच्च आदेश कार्यों को पसंद करते हैं )।
4) गणितीय शैली:
PEP 202 द्वारा संस्करण 2.0 में पेश किए जाने के बाद से सूची समझ पायथन में सूची हेरफेर के लिए पसंदीदा शैली बन गई । इसके पीछे तर्क यह है कि सूची comprehensions स्थितियों में सूची बनाने के लिए जहां एक और अधिक संक्षिप्त तरीके प्रदान करना है map()
और filter()
और / या नेस्टेड छोरों वर्तमान में इस्तेमाल किया जाएगा।
cleaned_list = [ x for x in some_list if x is not thing ]
पीईपी 289 द्वारा जेनरेटर एक्सप्रेशंस को 2.4 संस्करण में पेश किया गया था । एक जनरेटर अभिव्यक्ति उन स्थितियों के लिए बेहतर है जहां आपको स्मृति में पूरी सूची बनाने की आवश्यकता नहीं है (या चाहते हैं) - जैसे कि जब आप तत्वों को एक बार में एक से अधिक बनाना चाहते हैं। यदि आप सूची में केवल पुनरावृत्ति कर रहे हैं, तो आप एक जनरेटर के अभिव्यक्ति को एक आलसी मूल्यांकन सूची समझ के रूप में समझ सकते हैं:
for item in (x for x in some_list if x is not thing):
do_your_thing_with(item)
टिप्पणियाँ
- आप
!=
इसके बजाय असमानता ऑपरेटर का उपयोग करना चाहते हैं is not
( अंतर महत्वपूर्ण है )
- सूची की प्रतिलिपि बनाने के तरीकों के आलोचकों के लिए: लोकप्रिय धारणा के विपरीत, जनरेटर अभिव्यक्तियाँ हमेशा सूची की समझ से अधिक कुशल नहीं होती हैं - शिकायत करने से पहले कृपया प्रोफ़ाइल करें