2012-07-16 19 views
5

मेरे पास निम्नलिखित प्रश्न का समाधान है। यही कारण है कि वैकल्पिक हल निम्नलिखित की तरह उत्पादन में शामिल करने के लिए एक परीक्षण के साथ पाश के लिए एक होगा:सूची समझ डुप्लीकेट को फ़िल्टर क्यों नहीं करती है?

#!/usr/bin/env python 

def rem_dup(dup_list): 
    reduced_list = [] 
    for val in dup_list: 
     if val in reduced_list: 
      continue 
     else: 
      reduced_list.append(val) 

    return reduced_list 

मैं निम्नलिखित प्रश्न पूछ रहा हूँ, क्योंकि मैं अगर वहाँ एक सूची समझ समाधान है देखने के लिए उत्सुक हूँ।

reduced_vals = [] 
vals = [1, 2, 3, 3, 2, 2, 4, 5, 5, 0, 0] 

क्यों

reduced_vals = = [x for x in vals if x not in reduced_vals] 

एक ही सूची का उत्पादन करता है:

निम्नलिखित आंकड़ों को देखते हुए?

>>> reduced_vals 
[1, 2, 3, 3, 2, 2, 4, 5, 5, 0, 0] 

मुझे लगता है कि यह एक सूची में एक काम के हिस्से के रूप निर्गम (reduced_vals) की जाँच के साथ कुछ है। मैं उत्सुक हूँ, हालांकि सटीक कारण के रूप में।

धन्यवाद।

+0

आप [this] (http://stackoverflow.com/a/6197827/355230) उत्तर का उपयोग करके बहुत करीब आ सकते हैं। – martineau

उत्तर

6

सूची समझ एक नई सूची बनाता है, जबकि reduced_vals सूची समझ के मूल्यांकन के दौरान हर समय रिक्त सूची में इंगित करता है।

पायथन में असाइनमेंट के अर्थशास्त्र हैं: दाएं हाथ का मूल्यांकन करें और परिणामी वस्तु को बाएं हाथ के नाम पर बांधें। एक नंगे नाम के लिए एक असाइनमेंट कभी भी किसी ऑब्जेक्ट को म्यूटेट नहीं करता है।

वैसे, आपको एक कुशल तरीके से डुप्लिकेट को हटाने के लिए या collections.OrderedDict.fromkeys() का उपयोग करना चाहिए (इस पर निर्भर करता है कि आपको ऑर्डर को सुरक्षित रखने की आवश्यकता है या नहीं)।

+0

मैं संग्रह कैसे शामिल करूं? मैंने बस कोशिश की; यह आयात किया; लेकिन मुझे एक त्रुटि मिली >>> संग्रह। ऑर्डर्ड डिक्ट.फॉर्म्स (रंग) ट्रेसबैक (सबसे हालिया कॉल अंतिम): फ़ाइल "", लाइन 1, नाम त्रुटि: नाम 'संग्रह' परिभाषित नहीं किया गया है मैं उपयोग कर रहा हूं अजगर 2.7.x – octopusgrabbus

+1

@octopusgrabbus: 'आयात collections' –

+0

>>> आयात संग्रह >>> collections.OrderedDict.fromkeys (रंग) Traceback (सबसे हाल कॉल पिछले): फ़ाइल" ", लाइन 1, में विशेषताएँ त्रुटि: 'मॉड्यूल' ऑब्जेक्ट में कोई विशेषता नहीं है 'ऑर्डर्ड डिक्ट' – octopusgrabbus

1

क्योंकि सूची की सूची में तत्व reduced_vals तक पूरी सूची का निर्माण नहीं किए जाने तक असाइन नहीं किए जाते हैं। यदि आप यह काम करना चाहते हैं तो .append() के साथ for लूप का उपयोग करें।

+0

देखें कि पहले से ही मूल कोड में क्या हो रहा है (ओपी के 'वर्कअराउंड' के बिना) – Dhara

4

आप एक खाली सूची के खिलाफ परीक्षण कर रहे हैं।

अभिव्यक्ति का मूल्यांकन reduced_vals के नए मान के रूप में निर्दिष्ट करने से पहले पूर्ण रूप से किया जाता है, जो पूर्ण सूची अभिव्यक्ति का मूल्यांकन होने तक खाली रहता है।

इसे अलग करने के लिए, [x for x in vals if x not in reduced_vals] अभिव्यक्ति अलगाव में निष्पादित की जाती है। यह अगर आप एक थोड़ा संशोधित फैशन में अपने कोड को देखना मदद कर सकता है:

temp_var = [x for x in vals if x not in reduced_vals] 
reduced_vals = temp_var 
del temp_var 

सीधे ऊपर reduced_vals को सूची अभिव्यक्ति का परिणाम देने की नैतिक बराबर है, लेकिन मैं और अधिक स्पष्ट रूप का उपयोग करके परिणाम बताए अलग किया है एक दूसरा चर

4

इस पंक्ति में: [x for x in vals if x not in reduced_vals] वहाँ एक भी मान reduced_vals में नहीं नहीं है, reduced_vals के रूप में खाली सूची [] है। दूसरे शब्दों में, कुछ भी फ़िल्टर नहीं हो जाता है और vals में सभी तत्व वापस आते हैं।

आप इस प्रयास करें:

[x for x in vals if x in reduced_vals] 

परिणाम, खाली सूची [] है के रूप में सभी मूल्यों reduced_vals में (जो खाली है) नहीं हैं। मेरा मानना ​​है कि फ़िल्टरिंग भाग सूची सूची में कैसे काम करता है इसके साथ आपको भ्रम है: आप देखते हैं, फ़िल्टर केवल उन मानों का चयन करता है जो True स्थिति बनाते हैं, लेकिन यह डुप्लिकेट मानों को नहीं रोकेगा।

अब, यदि आपको डुप्लीकेट को फ़िल्टर करना है, तो एक सूची समझ नौकरी के लिए सही उपकरण नहीं है। उसके लिए, एक सेट का उपयोग - हालांकि यह आवश्यक रूप से मूल सूची के क्रम को सुरक्षित नहीं करेगा, यह गारंटी है कि तत्वों खास हैं:

vals = [1, 2, 3, 3, 2, 2, 4, 5, 5, 0, 0] 
list(set(vals)) 
> [0, 1, 2, 3, 4, 5] 
0

क्योंकि reduced_vals सूची समझ के मूल्यांकन के दौरान नहीं बदल रहा है।