2008-10-03 11 views
6

यह एक उदाहरण के साथ व्याख्या करने के लिए वास्तव में केवल आसान है के भीतर से एक dict के एक सबसेट निकाला जा रहा है, तो एक dict के भीतर से एक सूची के चौराहे दूर करने के लिए मैं आमतौर पर कुछ इस तरह करते हैं:एक सूची

a = {1:'', 2:'', 3:'', 4:''} 
exclusion = [3, 4, 5] 

# have to build up a new list or the iteration breaks 
toRemove = [] 
for var in a.iterkeys(): 
    if var in exclusion: 
     toRemove.append(var) 

for var in toRemove: 
    del a[var] 

यह एक असामान्य उदाहरण की तरह प्रतीत हो सकता है, लेकिन यह आश्चर्य की बात है कि मुझे इस तरह कुछ करने की ज़रूरत है। सेट के साथ ऐसा करना बहुत अच्छा होगा, लेकिन मैं स्पष्ट रूप से निर्देश के लिए 'मूल्य' को बनाए रखना चाहता हूं।

यह विधि परेशान है क्योंकि इसे दो लूप और अतिरिक्त सरणी की आवश्यकता है। क्या ऐसा करने का एक क्लीनर और अधिक कुशल तरीका है।

उत्तर

12

पर विचार करें dict.pop:

for key in exclusion: 
    a.pop(key, None) 

None एक अपवाद को ऊपर उठाने से पॉप रहता है जब key एक महत्वपूर्ण नहीं है।

+0

ओह, यह मेरे उत्तर से कहीं बेहतर है। – SpoonMeiser

+0

अच्छी टिप, dict.pop भूल गया है। – camflan

+0

आप किसी के बजाय किसी भी मूल्य का उपयोग नहीं कर सकते: हटाए गए = [d.pop (k, 0) ex के बहिष्कार में के लिए] – jfs

2

iterkeys के बजाय keys विधि का उपयोग क्यों न करें? इस तरह आप इसे एक लूप में कर सकते हैं क्योंकि यह एक सूची देता है, न कि एक इटरेटर।

3
a = dict((key,value) for (key,value) in a.iteritems() if key not in exclusion) 
+0

यह समाधान स्पष्ट लूप से बचाता है, जो कि अच्छा है, लेकिन यह स्क्रैच से शब्दकोश को पुनर्निर्मित करता है, जो खराब है। शायद शब्दकोशों को सेट से कुछ तरीकों को चुरा लेना चाहिए? –

+0

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

+0

मजेदार, एक 200k dict (एक [i] = i के लिए मैं रेंज (200k) में चाबियों में से आधे को हटा रहा हूं) एक लूप में मेरी मशीन पर केवल 30% धीमी गति से है। –

1

आप अपनी बहिष्करण सूची को एक सेट में बदल सकते हैं, फिर ओवरलैप प्राप्त करने के लिए केवल चौराहे का उपयोग करें।

exclusion = set([3, 4, 5]) 

for key in exclusion.intersection(a): 
    del a[key] 
संबंधित मुद्दे