2016-11-14 78 views
-1

我正在寫一個函數,讓我通過字典。該字典包含藝術家作爲鍵和他們的繪畫作爲價值觀。我需要在具有最大面積的字典中找到該繪畫,並且如果有兩個面積相等的字典,他們應該作爲元組列表返回。查找字典中最大的區域

例詞典:

{ 
     'A, Jr.':[("One",1400,10,20.5,"oil paint","Austria"),("Three",1400,100.0,100.0,"oil paint","France"),("Twenty",1410,50.0,200.0,"oil paint","France")], 
     'X':[("Eight",1460, 100.0, 20.0, "oil paint","France"),("Six",1465,10.0, 23.0, "oil paint", "France"),("Ten",1465,12.0,15.0,"oil paint","Austria"),("Thirty",1466,30.0,30.0,"watercolor","Germany")], 
     'M':[("One, Two", 1500, 10.0, 10.0, "panel","Germany")] 
     } 

基本上四位數字是繪畫或藝術作品創建年和接下來的兩個數字是長度和寬度。在乘以長度和寬度時,我需要返回具有最大面積的值。因此,對於上述辭典功能find_largest應該返回

find_largest(dictionary2()) 

[('A, Jr.', 'Three'), ('A, Jr.', 'Twenty')] 

由於100 * 100 = 10000「三化」繪畫和50 * 200 = 10000「二十」畫它們都返回元組列表中。

有沒有人有如何做到這一點的意見?我已經開始下面的代碼,但我不認爲這是正確的方法。

def find_largest(dictionary): 
    matches = {} 
    for key, the_list in db.items(): 
     for record in the_list: 
      value = record[4] 
      if dictionary in record: 
       if key in matches: 
        max(the_list) 
        max(lst, key=lambda tupl: tupl[2]*tupl[3]) 
        matches[key].append(record) 
       else: 
        matches[key] = [record] 
    return matches 

這基本上是我的代碼從一個較早的函數,有一些重大的變化。這個基本框架爲我的一些目標工作。我添加了最大(匹配),但我意識到這並沒有太大的作用,除非函數將長度和寬度相乘,然後查找最大值。如果任何人有意見這將有助於

+0

你可以通過'max'一個'key'參數:'MAX(LST,關鍵= lambda tupl:tupl [2] * tupl [3])'會從你的字典中的一個列表中得到具有最大面積的元組。 – schwobaseggl

+0

感謝您的建議,我應該把這個代替max(火柴)? – n00bprogrammer22

+0

這將更適合該代碼中的'max(the_list)',但max通常只會返回一個項目,即使多個項目共享最大值 – schwobaseggl

回答

2

它可能會更容易只是保持目前的最高的曲目,而不是

data = { 
     'A, Jr.':[("One",1400,10,20.5,"oil paint","Austria"),("Three",1400,100.0,100.0,"oil paint","France"),("Twenty",1410,50.0,200.0,"oil paint","France")], 
     'X':[("Eight",1460, 100.0, 20.0, "oil paint","France"),("Six",1465,10.0, 23.0, "oil paint", "France"),("Ten",1465,12.0,15.0,"oil paint","Austria"),("Thirty",1466,30.0,30.0,"watercolor","Germany")], 
     'M':[("One, Two", 1500, 10.0, 10.0, "panel","Germany")] 
     } 

def find_largest(d): 
    matches = [] 
    max_value = 0 
    for key in d: 
     for record in d[key]: 
      value = record[2] * record[3] 
      if value > max_value: 
       matches = [(key, record[0])] 
       max_value = value 
      elif value == max_value: 
       matches.append((key, record[0])) 
    return matches 

# Output 
>>> find_largest(data) 
[('A, Jr.', 'Three'), ('A, Jr.', 'Twenty')] 
+0

感謝這個解決方案是完美的。你知道如何讓這個函數返回None,如果匹配在最後是空的而不是返回空列表或'[]'? – n00bprogrammer22

+0

我試過elif len(火柴)== 0: matches = None但是這不起作用 – n00bprogrammer22

+0

如果字典爲空,函數將只返回None。所以你可以在開始for循環之前檢查一下,如果不是d:return。或者最初設置'matches = None'。或者,如果你不喜歡將其設置爲None的想法,只需添加一個檢查返回'如果匹配:返回匹配' –