Python 在字典中查找值最多的键

Python 在字典中查找值最多的键,python,python-3.x,find,key,max,Python,Python 3.x,Find,Key,Max,我正在开发一个函数,在这个函数中,我需要在字典中找到具有最多值的键(艺术家姓名)。有时两个键具有相同数量的值,在这种情况下,我需要返回艺术家姓名列表 示例字典: {'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")]

我正在开发一个函数,在这个函数中,我需要在字典中找到具有最多值的键(艺术家姓名)。有时两个键具有相同数量的值,在这种情况下,我需要返回艺术家姓名列表

示例字典:

{'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):
    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):
    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]

谢天谢地,有时它似乎会返回['U',M'],而不是['M',U'],当测试时,是否可以对其进行排序,以便它总是按顺序进行?我尝试过使用maxcount.sort(),但这不起作用,因为它是一个INT。您可以使用OrderedICT,它将在插入元素时保留元素的顺序。除了定义db=orderedict()而不是db={}之外,这里没有任何变化。除此之外,您还可以使用sorted(maxcount)对列表进行排序,这将为您提供['M','U']@n00bprogrammer22:是的,因为您传入了一个字典,而字典是一个无序的数据结构。如果您需要按特定顺序使用密钥,请将数据加载到
collections.orderedict()
对象中。是否有方法按字母顺序而不是字典对返回的列表进行排序?我想出了一种巧妙的方法来实现这一点,而无需使用orderedict并编辑您的代码,因为这似乎比使用orderedict更容易
>>> 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']
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]