2016-11-14 2 views
1

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

Пример Словарь:

{'M':[("One",1400,30.0, 20.5,"oil paint","Austria"),("Three",1430,100.0,102.0,"watercolor","France")], 
     'P':[("Eight",1460, 225.0, 200.0, "fresco","Netherlands")], 
     'U':[("Nine",1203,182.0, 957.0,"egg tempera","Italy"), ("Twelve",1200,76.2,101.6,"egg tempera","France")] 
     } 

Для этого словаря, поскольку М и У имеют наибольшее значение (М имеют 2 и U имеет 2 а Р имеет только 1) функция должна возвращать

artists_with_most_work(dictionary1()) 

['M', 'U'] 

Как я могу найти количество значений для каждого ключа и вернуть те, которые имеют наибольшее значение? Я полагал, что использование max() было бы хорошей идеей, но я не думаю, что правильно использую его в своей текущей попытке ниже. Благодаря тому, кто может помочь

Код:

def artist_with_most_work(db): 
    matches = [] 
    for key, record_list in db.items(): 
     for record in record_list: 
      if item in record: 
       max(db) = themax 
      matches.append(themax) 
     return matches 

ответ

5

Вы должны сначала найти максимальную длину, а затем вернуть все ключи, которые ссылаются на список с этой длиной:

def artist_with_most_work(db): 
    maxcount = max(len(v) for v in db.values()) 
    return [k for k, v in db.items() if len(v) == maxcount] 

Demo :

>>> def artist_with_most_work(db): 
...  maxcount = max(len(v) for v in db.values()) 
...  return [k for k, v in db.items() if len(v) == maxcount] 
... 
>>> d1 = {'M':[("One",1400,30.0, 20.5,"oil paint","Austria"),("Three",1430,100.0,102.0,"watercolor","France")], 
...  'P':[("Eight",1460, 225.0, 200.0, "fresco","Netherlands")], 
...  'U':[("Nine",1203,182.0, 957.0,"egg tempera","Italy"), ("Twelve",1200,76.2,101.6,"egg tempera","France")] 
...  } 
>>> artist_with_most_work(d1) 
['M', 'U'] 
+0

Спасибо, кажется, иногда возвращают ['U', 'M'] вместо ['M', 'U'] при тестировании можно сортировать это так, чтобы оно всегда делалось в порядке? Я пробовал делать maxcount.sort(), но это не работает, так как его int – n00bprogrammer22

+0

Вы можете использовать OrderedDict, который сохранит порядок элементов по мере их вставки. Здесь ничего не изменилось бы, кроме определения db = OrderedDict() вместо db = {}. Кроме этого, вы можете отсортировать список, используя отсортированный (maxcount), который должен дать вам ['M', 'U'] – Tyg13

+0

@ n00bprogrammer22: да, потому что вы передали в словаре, а словарь - неупорядоченная структура данных , Если вам нужны ваши ключи в определенном порядке, загрузите свои данные в объект 'collection.OrderedDict()'. –

0

Из-за требования вернуть всех членов галстука, вы должны отслеживать все возможности ностей,.

def artist_with_most_work(db): 
    keys_by_size = collections.defaultdict(list) 
    maxsize = 0 
    for key, recordlist in db.items(): 
     nitems = len(recordlist) 
     keys_by_size[nitems].append(key) 
     maxsize = max(maxsize, nitems) 

    return keys_by_size[maxsize] 
Смежные вопросы