2016-11-14 93 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")] 
     } 

对于由于M此字典和U具有的最值(M具有2和U具有2而P仅具有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] 

演示:

>>> 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:是的,因为你传递了一个字典,而一个字典是一个无序的数据结构。如果您需要按特定顺序输入密钥,请将数据加载到'collections.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]