2016-11-14 3 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 

Это в основном мой код из более ранней функции с несколькими значительными изменениями. Эта базовая структура работала для нескольких моих целей. Я добавил max (match), но я понимаю, что это не делает много, если функция не умножает длины и ширину, а затем ищет max. Если у кого есть советы, было бы полезно

+0

Вы можете передать '' max' в key' параметр: 'макс (LST, ключ = lambda tupl: tupl [2] * tupl [3]) 'доставит вам кортеж с наибольшей площадью из одного списка в вашем dict. – 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-loop 'if not d: return'. Или изначально установите 'matches = None'. Или если вам не нравится идея установить его в None, просто добавьте проверку для возврата 'if matches: return matches' –