2015-01-01 4 views
6

Iterating over dict values - इस प्रश्न से संबंधित:एकाधिक मूल्य खोज

def bla(self,x,y) 
    for i in self.DataBase.keys(): 
     for x,y in self.DataBase[i]: 
      if x == dept and y == year: 
       return self.DataBase[i] 

यह विचार, मैं कैसे एक चाबी लेने के लिए और कुंजी में n मूल्यों के लिए खोज करते हैं कि मैं प्राप्त करने के लिए कोशिश कर रहा हूँ की अधिक है , तो कुंजी

+0

यू उर इनपुट डेटा – Hackaholic

+0

ppl = कोर्स (123 दिखा सकते हैं के लिए सभी काम के बाद, 'प्रोग्रामिंग भाषाओं के सिद्धांत') ओएस = कोर्स (133, 'ऑपरेटिंग सिस्टम') डीबी = डीबी) ( डीबी.सेटकोर्स (पीपीएल, 'एसई', 2, 1) db.setCourse (ओएस, 'एसई' , 3, 1) –

+0

आपको प्रश्न में कोड डालना चाहिए ('संपादन' का उपयोग करें) क्योंकि यह टिप्पणियों में अच्छी तरह से प्रदर्शित नहीं होता है। –

उत्तर

3
नीचे

, विधि bla डेटाबेस कुंजी लौटाता है यदि x और y क्रमश: (जो भी लंबाई के) टपल के पहले और दूसरे तत्वों, उस कुंजी के अनुरूप से मेल खाते हैं:

def bla(self, x, y) 
    for key, value in self.DataBase.iteritems(): 
     if (x, y) == value[:2]: 
      return key 

और अब नीचे , विधि bla डेटाबेस कुंजी लौटाता है यदि डेटाबेस मूल्य जो एक टपल है दोनों x और y शामिल हैं:

def bla(self, x, y) 
    for key, value in self.DataBase.iteritems(): 
     if x in value and y in value: 
      return key 
+1

क्या iteritems() को अजगर 3 से हटा दिया गया है? मुझे लगता है कि आइटम() वह है जो आप चाहते हैं। मेरा जवाब देखें – Bolboa

+0

हां, python3 के लिए, आप किसी भी कार्यक्षमता को खोए बिना .items() के साथ .iteritems() को प्रतिस्थापित करते हैं। – dopstar

2

में मानों के बाद कुंजी को वापस कर दें क्योंकि आपने कहा है कि प्रश्न में "कुंजी वापस करें", मुझे लगता है कि आप वास्तव में उस शब्दकोश में कुंजी को अलग करना चाहते हैं जिसका मान खोज पैरामीटर के कुछ सेट से मेल खाता है (आपके द्वारा पोस्ट किया गया कोड खंड मान देता है, चाबियाँ नहीं)। मान लिया जाये कि self.Database एक शब्दकोश है, तो आप निम्नलिखित की तरह कुछ के साथ एक सूची समझ के रूप में चाबियाँ निकाल सकते:

def getMatchingKeys(self, x, y): 
    '''Extract keys whose values contain x and y (position does not matter)''' 
    return [i for i in self.Database if x in self.Database[i] and y in self.Database[i]] 

कुंजी जिनके मान दोनों एक्स और टपल में कहीं भी y लौटा दी जाएगी होते हैं। यदि आपको ट्यूपल में विशिष्ट स्थितियों से मेल खाना पड़ेगा, तो समझ के अंदर सशर्त को if x == self.Database[i][1] and y == self.Database[i][2] जैसे कुछ में बदला जा सकता है।

यदि आप चाबियों के बाद नहीं हैं, तो कृपया अपने प्रश्न को स्पष्ट करें।

+0

बीमार मेरी सबसे अच्छी व्याख्या करने का प्रयास करें, मेरे पास एक func है जो स्वयं को प्राप्त करता है, x, y क्या करने की आवश्यकता है प्रत्येक कुंजी में खोज करना है जो एक्स के लिए डेटाबेस (शब्दकोश डेटाबेस) है और वाई अगर डेटाबेस में एक्स और वाई [कुंजी] कुंजी वापस लौटें तो मुझे उम्मीद है कि यह अधिक समझने योग्य है और ट्यूपल्स आकार 2 के बाद अधिक हैं, वे एक कुंजी में एन मानों की खोज के लिए 4 या अधिक सटीक होने के लिए हैं। –

+0

@ माइक.जी इससे थोड़ा सा स्पष्टीकरण मिलता है - मैंने तदनुसार अपना जवाब संपादित कर लिया है। जैसा कि मैंने उत्तर में उल्लेख किया है, सटीक कार्यान्वयन इस बात पर निर्भर करेगा कि क्या आप एक्स और वाई को टुपल में कहीं भी खोजना चाहते हैं या यदि आप विशिष्ट स्थितियों में देख रहे हैं। – rchang

+0

मुझे विश्वास है कि, यह विशिष्ट स्थितियों में होगा कि मूल्यों का अर्थ होगा कि प्रवेश कुंजी प्रत्येक कुंजी के लिए समान है। मेरा मतलब है कि मूल्य जो उसके मूल्यों को मानता है, प्रत्येक मान के लिए एक ही स्थिति होगी। –

1

आप अंतर्निहित map() स्थापित करने के लिए उपयोग कर सकते हैं x और +०१२३७१९२२४२१चर।

def bla(self,x,y) : 
    for key in self.DataBase : 
     x,y = map(float, self.DataBase[key]) 
     if x == dept and y == year: 
      return key 

आप items() उपयोग करने को प्राथमिकता हैं, तो आप के रूप में अच्छी निम्नलिखित (समान रूप से मान्य) कर सकते हैं:

def bla(self,x,y): 
    for key, val in self.DataBase.items(): 
     x, y = map(float, val) 
     if x == dept and y == year: 
      return key 

यहाँ अभी तक map() बिना यह कर का एक और तरीका है, यह आप खोल के लाभ देता है

def bla(self,x,y): 
    for key, (x, y) in self.DataBase.items(): 
     if x == dept and y == year: 
      return key 

आपको ऊपर इतनी के रूप में, सूची समझ का उपयोग कर लिख सकते हैं, हालांकि मैं कहूंगा: tuples dict से अधिक पुनरावृत्ति करते हुए एक के ऊपर बेहतर है:

def bla(self,x,y): 
    found = {key for key, (x, y) in self.DataBase.items() if x==dept and y==year} 
    found = ''.join(num) #joins set into string 
    return found 

अजगर 3 है, जो मुझे लगता है कि आप अपने टैग्स में से एक के बाद से क्या चाहते हैं कर रहे हैं Python 3.x

+1

'मानचित्र' का उपयोग करना अनावश्यक है क्योंकि 'bla' विधि को फ़्लोट करने के लिए अपने तर्कों के प्रकार रूपांतरण को लागू करने का कोई कारण नहीं है। आपके सभी कोड स्निपेट्स में, तर्क 'x' और 'y' फिर से असाइनमेंट चरण द्वारा छायांकित होते हैं जो उन्हें स्वयं देते हैं। डेटाबेस मूल्य। एक अनपॅकिंग त्रुटि भेद्यता भी है क्योंकि एक धारणा है कि स्वयं। डेटाबेस मूल्य ठीक लंबाई 2 की ट्यूपल्स या सूचियां होंगी (जिसे ओपी ने कहा था कि यह मामला है)। मुझे लगता है कि 'गहराई' और 'वर्ष' तर्कों के रूप में ग्लोबल्स नहीं थे। अन्यथा 'bla' विधि हस्ताक्षर पर तर्कों की कोई आवश्यकता नहीं है। – dopstar

संबंधित मुद्दे