【问题标题】:Finding key(s) with most values in dictionary查找字典中值最多的键
【发布时间】:2016-11-14 21:59:50
【问题描述】:

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

词典示例:

{'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

【问题讨论】:

    标签: python python-3.x find key max


    【解决方案1】:

    您必须首先找到最大长度,然后返回引用具有该长度的列表的所有键:

    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']
    

    【讨论】:

    • 谢谢,这似乎有时会返回 ['U', 'M'] 而不是 ['M', 'U'] 在测试时是否可以对其进行排序,所以它总是按顺序进行?我尝试做 maxcount.sort() 但这不起作用,因为它是一个 int
    • 您可以使用 OrderedDict,它会在插入元素时保留元素的顺序。除了定义 db = OrderedDict() 而不是 db = {} 之外,这里没有任何变化。除此之外,您可以使用 sorted(maxcount) 对列表进行排序,这应该会给您 ['M', 'U']
    • @n00bprogrammer22:是的,因为你传入了一个字典,而字典是一个无序的数据结构。如果您需要按特定顺序使用密钥,请将数据加载到 collections.OrderedDict() 对象中。
    • 有没有办法按字母顺序而不是字典对返回的列表进行排序?
    • 我想出了一个不使用 OrderedDict 的巧妙方法来完成此任务并编辑了您的代码,因为它似乎比使用 OrderedDict 更容易
    【解决方案2】:

    由于要求返回平局的所有成员,因此您必须跟踪所有可能性。

    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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 2011-04-28
      • 2022-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多