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