Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何返回字符串中最频繁的字母,并根据其频率计数对其排序_Python_String_Python 2.7_Sorting_Counter - Fatal编程技术网

Python 如何返回字符串中最频繁的字母,并根据其频率计数对其排序

Python 如何返回字符串中最频繁的字母,并根据其频率计数对其排序,python,string,python-2.7,sorting,counter,Python,String,Python 2.7,Sorting,Counter,我有这个字符串:s=“中国建设银行”。我想创建一个函数,返回3个最常见的字符,并根据它们的出现频率和出现次数对它们进行排序,但如果2个字符出现相同次数,则应根据它们的字母顺序对它们进行排序。我还想在单独的行中打印每个字符 到目前为止,我已经构建了以下代码: from collections import Counter def ordered_letters(s, n=3): ctr = Counter(c for c in s if c.isalpha()) print ''.

我有这个字符串:
s=“中国建设银行”
。我想创建一个函数,返回3个最常见的字符,并根据它们的出现频率和出现次数对它们进行排序,但如果2个字符出现相同次数,则应根据它们的字母顺序对它们进行排序。我还想在单独的行中打印每个字符

到目前为止,我已经构建了以下代码:

from collections import Counter
def ordered_letters(s, n=3):
    ctr = Counter(c for c in s if c.isalpha())
    print ''.join(sorted(x[0] for x in ctr.most_common(n)))[0], '\n', ''.join(sorted(x[0] for x in ctr.most_common(n)))[1], '\n', ''.join(sorted(x[0] for x in ctr.most_common(n)))[2]`
应用于上述字符串的代码将产生:

a 
c 
n
但这不是我真正想要的,我想要的输出是:

1st most frequent: 'n'. Appearances: 4
2nd most frequent: 'c'. Appearances: 3
3rd most frequent: 'a'. Appearances: 2
我被困在我必须按字母顺序打印频率相同的字符的部分。我怎么能这样做


非常感谢您

您可以使用自定义键对
c.most_common()
进行排序,该键首先考虑频率的降序,然后再考虑字母顺序(注意
lambda x:(-x[1],x[0])
):

可以与自定义排序键一起使用。我们使用
-ord(k)
作为二级分类器,按升序字母进行排序。使用堆队列比使用堆队列好,因为不需要对
计数器中的所有项进行排序

from collections import Counter
from heapq import nlargest

def ordered_letters(s, n=3):
    ctr = Counter(c.lower() for c in s if c.isalpha())

    def sort_key(x):
        return (x[1], -ord(x[0]))

    for idx, (letter, count) in enumerate(nlargest(n, ctr.items(), key=sort_key), 1):
        print('#', idx, 'Most frequent:', letter, '.', 'Appearances:', count)

ordered_letters("china construction bank")

# 1 Most frequent: n . Appearances: 4
# 2 Most frequent: c . Appearances: 3
# 3 Most frequent: a . Appearances: 2

按常规方式对
计数器中的元组进行排序,但其第一个参数(计数本身)为负数。这将产生一个反向列表,但第二个元组元素按字母顺序排序。然后取最后n项


(Freaky
ordinal
lambda提供)

您可以使用defaultdict创建一个值设置为0的字典,并在遇到值时将其递增。首先按字母顺序排序,然后按出现次数排序。这可以确保任何匹配的值都按字母顺序排列优先级

例如:

这将提供与指定内容匹配的输出:

1 Most frequent: n . Appearances: 4
2 Most frequent: c . Appearances: 3
3 Most frequent: a . Appearances: 2

字母n出现4次中国建设银行,计数高于c,因此必须出现在c之前?对不起,编辑好了。”例如,a应出现在“i”之前,因为它们的频率相同。计数区分大小写。不,不需要区分大小写。您的示例有缺陷。在前三名中没有出现相同的频率。嗨,谢谢你的回答,但这显然不会返回预期的输出,这是一种非常优雅的方式。我不知道heapq或NLAGEST。非常感谢!!
from collections import Counter

ordinal = lambda n: "%d%s" % (n,"tsnrhtdd"[(n/10%10!=1)*(n%10<4)*n%10::4])

def ordered_letters(s, n=3):
    ctr = Counter(c for c in s if c.isalpha())
    ctr = sorted(ctr.items(), key=lambda x: (-x[1], x[0]))[:n]
    for index,value in enumerate(ctr):
        print "{:s} most frequent: '{:}'. Appearances: {:}".format(ordinal(index+1),value[0],value[1])

s = "achina aconstruction banck"
ordered_letters(s, n=3)
from collections import defaultdict
a = {} 
a = defaultdict(lambda:0,a)

s = "china construction bank"

for letter in s:
    if letter != ' ':
        a[letter] += 1

top_three = sorted(sorted(a.items(), key=lambda x: x[0]), key=lambda x: x[1], reverse=True)[:3]

counter = 0
for letter, occurance in top_three:
    counter += 1
    print(str(counter) + " Most frequent: " + letter + " . Appearances: " + str(occurance))
1 Most frequent: n . Appearances: 4
2 Most frequent: c . Appearances: 3
3 Most frequent: a . Appearances: 2