2016-11-14 77 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的想法,只需添加一个检查返回'如果匹配:返回匹配' –