set.remove
एक इन-प्लेस ऑपरेशन है। इसका मतलब है कि यह कुछ भी वापस नहीं करता है (ठीक है, यह None
देता है); और bool(None)
False
है।
तो अपनी सूची समझ प्रभावी रूप से है यह:
answer = []
for item in seq:
if item in uniq and not uniq.remove(item):
answer.append(item)
और के बाद से अजगर सशर्त से कम सर्किटिंग (के रूप में अन्य लोगों ने बताया है) करता है, यह प्रभावी रूप से है:
answer = []
for item in seq:
if item in uniq:
if not uniq.remove(item):
answer.append(item)
बेशक
, के बाद से unique.remove(item)
None
लौटाता है (bool
जिसमें से False
है), दोनों स्थितियों का मूल्यांकन किया जाता है या न ही।
uniq
से item
को हटाने का कारण यह है कि दूसरी स्थिति मौजूद है। इस तरह, अगर आपको item
फिर से सामना करना पड़ता है (seq
में डुप्लिकेट के रूप में), यह uniq
में नहीं मिलेगा क्योंकि इसे पिछली बार वहां मिले uniq
से हटा दिया गया था।
अब ध्यान रखें, यह काफी खतरनाक है क्योंकि वेरिएबल्स को संशोधित करने वाली स्थितियों को खराब शैली माना जाता है (जब आप पूरी तरह से परिचित नहीं होते हैं तो इस तरह के एक सशर्त डिबगिंग की कल्पना करें)। कंडीशनरों को वास्तव में उन चरों को संशोधित नहीं करना चाहिए जिन्हें वे चेक करते हैं। इस प्रकार, उन्हें केवल वेरिएबल पढ़ना चाहिए, उन्हें भी नहीं लिखना चाहिए।
आशा इस मदद करता है
मैं वास्तव में इस कोड की तरह =) – katrielalex
@katrielalex -- मैं नही। किसी संग्रह से निकालने और आइटम के दुष्प्रभाव के लिए एक शर्त का उपयोग करने से भ्रमित, कोड पढ़ने में कठिनाई होती है। (आईएमएचओ) – mgilson
प्लस आप एक पूरी नई 'सेट' बना रहे हैं और सूची में फ़िल्टर के रूप में कार्य करने के लिए बस से प्रत्येक आइटम पॉप अप कर रहे हैं। मैं कल्पना नहीं कर सकता कि यह तेज़ है, और यह निश्चित रूप से स्पष्ट नहीं है, एक एकल पास (एक नई डी-डुप्लीड सूची बनाने के लिए) या डबल पास (सूची में डी-डुप्लींग के लिए) 'लूप के लिए । –