2015-01-01 20 views
6

Iterating over dict values - liên quan đến câu hỏi này:tìm kiếm giá trị Nhiều trong các phím từ điển

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] 

Đây là nhiều ý kiến ​​cho rằng tôi đang cố gắng để đạt được, làm thế nào để tôi lấy một chìa khóa và tìm kiếm các giá trị n trong khóa , sau đó trả lại khóa nếu các giá trị nằm trong khóa

+0

u có thể hiển thị dữ liệu đầu vào ur – Hackaholic

+0

ppl = khóa học (123, 'Nguyên tắc Ngôn ngữ lập trình') os = Khóa học (133, 'Hệ điều hành') db = DB) ( db.setCourse (ppl, 'SE', 2, 1) db.setCourse (os, 'SE' , 3, 1) –

+0

Bạn nên đặt mã trong câu hỏi (sử dụng 'chỉnh sửa') vì nó không hiển thị trong các bình luận tốt. –

Trả lời

3

Dưới đây, phương pháp bla trả chìa khóa cơ sở dữ liệu nếu x và y phù hợp với các yếu tố đầu tiên và thứ hai của tuple (của bất cứ chiều dài), tương ứng, tương ứng với phím:

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

Và bây giờ bên dưới , phương pháp bla trả chìa khóa cơ sở dữ liệu nếu giá trị cơ sở dữ liệu mà là một tuple chứa cả x và y:

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

Không iteritems() đã được gỡ bỏ từ python 3? Tôi nghĩ rằng các mục() là những gì bạn muốn. Xem câu trả lời của tôi. – Bolboa

+0

Vâng, đối với python3, bạn chỉ cần thay thế .iteritems() bằng .items() mà không mất bất kỳ chức năng nào. – dopstar

2

Vì bạn đã nói "trả lại khóa" trong câu hỏi, tôi cho rằng bạn thực sự muốn cách ly các khóa trong từ điển có giá trị khớp với một số tham số tìm kiếm (đoạn mã bạn đăng trả về các giá trị, không phải các khóa). Giả sử self.Database là một cuốn từ điển, bạn có thể trích xuất các phím như một sự hiểu biết danh sách với một cái gì đó như sau:

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]] 

phím có giá trị chứa cả x và y bất cứ nơi nào trong tuple sẽ được trả lại. Nếu bạn cần phải phù hợp với các vị trí cụ thể trong bộ dữ liệu, điều kiện bên trong hiểu có thể được thay đổi thành một cái gì đó như if x == self.Database[i][1] and y == self.Database[i][2].

Nếu bạn không tuân thủ các khóa, vui lòng làm rõ câu hỏi của bạn.

+0

bệnh cố gắng giải thích tốt nhất của tôi, tôi có một func tự nhận, x, y những gì nó cần làm là tìm kiếm trong mỗi khóa đó là cơ sở dữ liệu (cơ sở dữ liệu từ điển) cho x và y nếu x và y trong cơ sở dữ liệu [key] trả về khóa i hy vọng thats dễ hiểu hơn và các tuple có nhiều hơn thì kích thước 2, chúng là 4 hoặc thậm chí acurrate hơn, để tìm kiếm các giá trị n trong một khóa. –

+0

@ Mike.G Điều đó giúp làm rõ một chút - Tôi đã chỉnh sửa câu trả lời của mình cho phù hợp. Như tôi đã đề cập trong câu trả lời, việc triển khai chính xác sẽ khác nhau tùy thuộc vào việc bạn định tìm kiếm x và y ở bất kỳ nơi nào trong bộ hoặc nếu bạn đang tìm kiếm ở các vị trí cụ thể. – rchang

+0

tôi tin rằng, đó sẽ là ở các vị trí cụ thể mà các giá trị sẽ có ý nghĩa thứ tự nhập là như nhau cho mỗi khóa. tôi có nghĩa là chìa khóa mà giữ các giá trị của nó allways sẽ được các vị trí tương tự cho mỗi giá trị. –

1

Bạn có thể sử dụng được xây dựng trong map() để thiết lập xy biến.

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 

Nếu bạn thích sử dụng items(), bạn có thể làm như sau cũng (giá trị ngang nhau):

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 

Dưới đây là một cách khác để làm việc đó mà không map(), điều này mang đến cho bạn những lợi thế của giải nén tuples trong khi lặp lại trên dict:

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

Bạn cũng có thể viết ở trên như vậy, sử dụng danh sách hiểu, mặc dù tôi sẽ nói một ở trên là một lợi thế:

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 

Sau đây tất cả công việc cho Python 3, mà tôi giả định là những gì bạn muốn từ một trong các thẻ của bạn được Python 3.x

+1

Sử dụng 'map' là không cần thiết vì không có lý do gì cho phương thức' bla' để áp đặt kiểu chuyển đổi của các đối số của nó thành float. Trong tất cả các đoạn mã của bạn, các đối số 'x' và' y' bị che khuất bởi bước gán lại cung cấp cho chúng giá trị self.DataBase. Ngoài ra còn có lỗ hổng giải nén lỗi vì có giả thiết rằng giá trị self.DataBase sẽ là các bộ dữ liệu hoặc danh sách có độ dài chính xác 2 (trong đó OP nêu rõ trường hợp của nó). Tôi nghĩ rằng 'depth' và' year' có nghĩa là các đối số không phải là hình cầu. Nếu không, không cần đối số về chữ ký phương thức 'bla'. – dopstar

Các vấn đề liên quan