获得列表中重复次数最多的名称,如果出现平局,则按字母顺序排列第一个

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获得列表中重复次数最多的名称,如果出现平局,则按字母顺序排列第一个相关的知识,希望对你有一定的参考价值。

我正在尝试获得列表上重复次数最多的名称,如果有平局,则返回按字母顺序在前出现的那个。

我有以下列表:

names = ['sam','sam','leo','leo','john','jane','jane']

对于此列表,它应该返回jane,因为与其他名称有两个联系,但第一个按字母顺序是。

我在python中有以下代码。

def get_count(lst):
    lst.sort()
    d = {}
    for item in lst:
        if item not in d:
            d[item] = [1]
        else:
            d[item].append(1)
    def get_count_child(d):
        fd = {}
        for key, value in d.items():
            fd[key] = sum(value)
        return fd
    return get_count_child(d)

输出

{'jane': 2, 'john': 1, 'leo': 2, 'sam': 2}

是否有一种方法可以利用我上面提到的约束从jane中提取值?

答案

说,d是您的字典。您要按值减小(计数)但键增大(名称)的顺序对项目进行排序。列表中第一个排序的项目是您想要的项目:

wanted = sorted(d.items(), key=lambda x: (-x[1], x[0]))[0]
# ('jane', 2)
wanted[0]
# 'jane'

请注意lambda函数中的取反:它确保较小的计数看起来“较大”并放在更靠近末端的位置。

另一答案

如果使用的是python 3.7+,则可以对名称进行排序,而dict将保存插入顺序。

from collection import Counter
names = sorted(['sam','sam','leo','leo','john','jane','jane'])
names_count = Counter(names)
names_count.most_common(1)

否则,要保证顺序不依赖于python版本,您可以执行以下操作

def get_names_count(lst):
    names_count = {}
    for item in sorted(lst):
        names_count[item] = names_count.get(item, 0) + 1

    return names_count

def get_most_common_name(names_count):
    most_common = sorted(names_count, key=lambda x: (-x[1], x[0]))
    return most_common[0]

请注意,我用lst.sort()替换了sorted(lst),因为修改全局对象是一种不好的做法(Python将指针传递给列表,而不是其副本)

而且,也不需要将其计数存储在列表中,因此您可以立即对每个名称使用默认值0的名称进行计数

P.S。在我发布此内容时,DYZ已经回答了这个问题,所以我的代码只是对您的get_names_count

的重构。
另一答案

Python 3.7+或CPython 3.6:Counter.most_common

使用collections.Counter对已排序列表进行计数,然后使用其collections.Counter来获得最上面的项目。领带由于第一次出现而破裂,因此这就是列表需要排序的原因。

most_common method

这是版本依赖性的,因为它依赖于基础的dict来保留插入顺序。参见most_common

如果使用的是较早版本,则仍然可以使用from collections import Counter c = Counter(sorted(names)) print(c.most_common(1)) # -> [('jane', 2)] print(c.most_common(1)[0][0]) # -> jane ,但是使用Are dictionaries ordered in Python 3.6+?

另一答案

使用此Counter更改“ get_count_child”函数的返回值

因此应该类似于以下内容:

DYZ's solution to do the sorting

以上是关于获得列表中重复次数最多的名称,如果出现平局,则按字母顺序排列第一个的主要内容,如果未能解决你的问题,请参考以下文章

有一万条字符串,要找出前10条出现次数最多的,该如何解决

快速 SQL 问题!按属性出现次数最多的地方排序

从数组中找到元素出现次数最多的元素

python 怎么提取列表中出现次数最多的值

排列并查找列表中出现次数最多的项目

查找输入字符串中出现字符次数最多的那个字和重复次数