按字母顺序排列具有相同计数的元素

问题描述 投票:6回答:7

Python Collection Counter.most_common(n)方法返回前n个元素及其计数。但是,如果两个元素的计数相同,我如何返回按字母顺序排序的结果?

例如:对于像:BBBAAACCD这样的字符串,对于“最常见的2个”元素,我希望结果是指定的n = 2

[('A', 3), ('B', 3), ('C', 2)]

并不是:

[('B', 3), ('A', 3), ('C', 2)]

请注意,虽然AB具有相同的频率,但AB之前出现在结果列表中,因为它按字母顺序出现在B之前。

[('A', 3), ('B', 3), ('C', 2)]

我怎样才能做到这一点?

python counter python-collections
7个回答
2
投票

这里有两个问题:

  1. 在考虑排除重复的前n个最常见值时包括重复项。
  2. 对于任何重复项,请按字母顺序排序。

迄今为止,所有解决方案都没有解决第一个问题。您可以将堆队列与itertools unique_everseen recipe(也可用于第三方库,如toolz.unique)一起计算第n个最大计数。

然后使用sorted和自定义键。

from collections import Counter
from heapq import nlargest
from toolz import unique

x = 'BBBAAACCD'

c = Counter(x)
n = 2
nth_largest = nlargest(n, unique(c.values()))[-1]

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

gen = ((k, v) for k, v in c.items() if v >= nth_largest)
res = sorted(gen, key=sort_key)

[('A', 3), ('B', 3), ('C', 2)]

0
投票

我会去:

sorted(Counter('AAABBBCCD').most_common(), key=lambda t: (-t[1], t[0]))

这种排序计数递减(因为它们已经存在,应该更具性能),然后按名称在每个相等的计数组中按升序排序


0
投票

这是我在面试考试中遇到的问题之一,但未能成功。回家睡了一会儿,解决了我的想法。

from collections import Counter


def bags(list):
    cnt = Counter(list)
    print(cnt)
    order = sorted(cnt.most_common(2), key=lambda i:( i[1],i[0]), reverse=True)
    print(order)
    return order[0][0]


print(bags(['a','b','c','a','b']))

0
投票

我首先按字母顺序对输出数组进行排序,然后按大多数事件排序,这将按字母顺序排列:

from collections import Counter
alphabetic_sorted = sorted(Counter('BBBAAACCD').most_common(), key=lambda tup: tup[0])
final_sorted = sorted(alphabetic_sorted, key=lambda tup: tup[1], reverse=True)
print(final_sorted[:3])

输出:

[('A', 3), ('B', 3), ('C', 2)]

0
投票
s = "BBBAAACCD"    
p = [(i,s.count(i)) for i in sorted(set(s))]

**如果你没有使用计数器就可以了。


0
投票
from collections import Counter


s = 'qqweertyuiopasdfghjklzxcvbnm'

s_list = list(s)

elements = Counter(s_list).most_common()

print(elements)
alphabet_sort = sorted(elements, key=lambda x: x[0])
print(alphabet_sort)
num_sort = sorted(alphabet_sort, key=lambda x: x[1], reverse=True)
print(num_sort)

如果你需要切片:

print(num_sort[:3])

-2
投票
from collections import Counter
print(sorted(Counter('AAABBBCCD').most_common(3)))

这个问题似乎是重复的How to sort Counter by value? - python

© www.soinside.com 2019 - 2024. All rights reserved.