2015-01-01 15 views
6

Iterating over dict values - Bu soruya ilişkin:Çoklu değer arama

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] 

Bu benim bir anahtarı alıp anahtar n değerleri için arama yapabilirim nasıl elde etmek çalışıyorum fikri, daha fazlasıdır Değerler anahtarın

+0

u ur giriş verileri – Hackaholic

+0

ppl = Kursu (123 gösterebilir edilir etiketlerinizden biri beri istediğini varsayalım Python 3 için tüm çalışmaları takip 'Programlama Dilleri Prensipleri') os = Kurs (133, 'İşletim Sistemleri') db = DB) ( db.setCourse (ppl, 'SE', 2, 1) db.setCourse (os, 'SE' , 3, 1) –

+0

Yorumları iyi göstermediği için soruna kod koymalı ('edit' kullan). –

cevap

3

, x ve y, anahtara tekabül eden sırasıyla (herhangi bir uzunluk) başlığın birinci ve ikinci elemanları, eşleşen, veritabanı anahtar verir bla yöntem şimdi aşağıda

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

ve veritabanı anahtar verir bla yöntem tuple olan veritabanı değer x ve y her ikisi de içeriyorsa:

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

Python 3'ten iteritems() kaldırılmadı mı? Bence item() istediğin şeydir. Cevabımı gör. – Bolboa

+0

Evet, python3 için .iteritems() öğesini .items() ile herhangi bir işlevsellik kaybetmeden değiştirmeniz yeterlidir. – dopstar

2

anahtarında dönerse anahtarı döndürün Sorunun içinde "anahtarı döndür" dediğinizden beri, gerçekten, değerlerin bir takım arama parametreleri kümesine eşleştiği sözlükteki tuşları ayırmak istediğinizi varsayalım (Gönderdiğiniz kod parçası, anahtarları değil değerleri döndürür). bir sözlük self.Database varsayarsak, aşağıdaki gibi bir şey ile bir liste kavrama gibi tuşları ayıklamak olabilir:

, değerleri x ve her yerde demet içinde y iade edilecektir her ikisini de içerir
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]] 

Tuşlar. Eğer tuple'daki belirli pozisyonları eşleştirmeniz gerekiyorsa, kavrama içindeki koşullu koşul, if x == self.Database[i][1] and y == self.Database[i][2] gibi bir şeye dönüştürülebilir.

Anahtarlardan sonra değilseniz, lütfen sorunuzu açıklığa kavuşturun. Aşağıda

+0

nedenini en iyi explane denemek için düzenleyemem, kendim alır bir func var, x, y x için veritabanı (sözlük veritabanı) olan her anahtarda aramaktır y veritabanındaki x ve y anahtarını döndürürse, umarım daha anlaşılabilir olur ve tupllar boyut 2'den daha fazladır, 4 ya da daha da keskin olurlar, bir anahtardaki n değerlerini aramak için. –

+0

@ Mike.G Bu biraz açıklığa kavuşmasına yardımcı oluyor - cevabımı buna göre düzenledim. Cevapta bahsettiğim gibi, tam uygulama, t ve herhangi bir yerde x ve y aramayı veya belirli pozisyonlara bakmayı amaçladığınıza bağlı olarak değişecektir. – rchang

+0

, bu, belirli konumlarda, değerlerin giriş sırasının her anahtar için aynı olduğunu anlayacağına inanmaktadır. Değerleri tutan anahtarın her bir değer için her zaman aynı pozisyonlar olacağını kastediyorum. –

1

için dahili map() ayarlamak için kullanabilir x ve y değişkenleri.

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 

Eğer items() kullanmayı tercih ederseniz (eşit geçerlidir) yanı aşağıdakileri yapabilirsiniz:

İşte
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() olmadan bunu yapmanın bir başka yolu, bu size açma avantajına verir söyleyebilirim rağmen,

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

Ayrıca liste kavrayışa sahip olma, böylece yukarıda yazabilirsiniz: tuples dict yineleme sırasında biri yukarıda tercih edilir:

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 

Ben Python 3.x

+1

'map' yönteminin, argümanlarının float için tür dönüşümünü zorunlu kılmasının bir nedeni olmadığı için' map' kullanmak gereksizdir. Tüm kod parçacıklarınızda, x' ve 'y' argümanları kendilerine self.DataBase değerleri veren yeniden atama adımı tarafından gölgelenir. Ayrıca self.DataBase değerlerinin olduğu varsayımı olduğundan bir açma hatası güvenlik açığı da vardır. Tuples veya tam uzunlukta 2 listesi olacaktır (OP'nin bu durumda olduğunu belirtmiştir). Bence "derinlik" ve "yıl", küresel olmayan argümanlar olmaktı. Aksi takdirde, 'bla' metodu imzasındaki argümanlara ihtiyaç yoktur. – dopstar

İlgili konular