2011-09-20 13 views
5

मैं सूची से एक शब्दकोश को निकालने का प्रयास कर रहा हूं यदि यह पहले से मौजूद है लेकिन ऐसा लगता है कि यह काम नहीं कर रहा है। किसी को भी मैं गलत क्या कर रहा हूँ देख सकते हैं या मुझे सलाह मैं क्या कर किया जाना चाहिएपायथन - मौजूद होने पर सूची से शब्दकोश हटाएं

new_dict = {'value': 'some value', 'key': 'someKey'} 
if new_dict in my_list: 
    my_list.remove(new_dict) 

new_list सकते हैं शब्दकोशों की एक सूची जहां new_dict

+4

यह मेरे लिए काम करता निकाला नहीं गया है। आप my_list कैसे बनाते हैं? – Louis

उत्तर

7

हैं new_dict "निश्चित रूप से" my_list में है, तो my_list.remove(new_dict) चाल करना चाहिए (जैसे कि, if new_dict in my_list की कोई आवश्यकता नहीं, कि बस इसे धीमा कर देती है नीचे)।

+3

यह। सुरक्षित पक्ष पर रहने के लिए, आप इसे 'कोशिश/छोड़कर' में लपेट सकते हैं और फिर 'ValueError' के साथ सौदा कर सकते हैं। –

1

ज्यादातर मामलों में यह एक नई सूची का निर्माण करने के चालाक है में निश्चित रूप से है:

new_list = [ dd for dd in my_list if not dd is new_dict ] 

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

+0

क्या आप वाकई '==' के बजाय 'is' का उपयोग करना चाहते हैं? –

+0

यह सवाल का जवाब नहीं है। यह एक और तरीका है जो कुछ भी नहीं बदलेगा अगर उसे जो मिला वह उसके लिए काम नहीं कर रहा है। और व्यक्तिगत रूप से, मैं आपसे दृढ़ता से असहमत हूं कि "ज्यादातर मामलों में यह एक नई सूची बनाने के लिए चालाक है"। मैं कहूंगा कि कभी-कभी यह वांछित होगा, लेकिन लगभग हमेशा यह अक्षम होगा। –

+0

@Tim: यह निर्भर करता है। लेकिन जैसा कि सवाल "इन" में उपयोग किया गया है, आप सही हैं, यह "==" होना चाहिए। – rocksportrocker

4
my_list = [1,{'value':'some value', 'key' :'somekey'}, 2, {'z':'z', 'x': 'x'}] 
new_dict = {'value':'some value', 'key' :'somekey'} 
#new_dict = {'z':'z', 'x': 'x'} 

differ = 0 
matched = 0 
for element in my_list: 
    if type(element) is types.DictType and matched != 0: 
     differ = 0 
     # check if dictionary keys match 
     if element.viewkeys() == new_dict.viewkeys(): 
      # check if dictionary values match 
      for key in element.keys(): 
       if element[key] != new_dict[key]: 
        differ = 1 
     matched = 1 

if differ != 1: 
    my_list.remove(new_dict) 

print my_list 

यह मेरे लिए दोनों शब्दकोशों के लिए काम करता है।

0

आपकी समस्या इस तथ्य से आ सकती है कि पर पुनरावृत्ति करते समय एक सूची से हटाकर सूची सुरक्षित नहीं है। आप जो करना चाहते हैं वह कुछ है:

copied_list = my_list[:] 
if new_dict in copied_list: 
    my_list.remove(new_dict) 

इस तरह, आप सूची की प्रतिलिपि पर पुन: सक्रिय होते हैं और मूल से हटाते हैं।

हालांकि यह आपकी समस्या का कारण नहीं हो सकता है। यह देखना दिलचस्प होगा:

  • आप my_list
  • आप पाश के बाद my_list साथ क्या करते हैं, कैसे निर्माण अर्थात कैसे आप महसूस अपने शब्दकोश
संबंधित मुद्दे