Python Collection Counter.most_common(n)
方法返回前n个元素及其计数。但是,如果两个元素的计数相同,我如何返回按字母顺序排序的结果?
例如:对于像:BBBAAACCD
这样的字符串,对于“最常见的2个”元素,我希望结果是指定的n = 2
:
[('A', 3), ('B', 3), ('C', 2)]
并不是:
[('B', 3), ('A', 3), ('C', 2)]
请注意,虽然A
和B
具有相同的频率,但A
在B
之前出现在结果列表中,因为它按字母顺序出现在B
之前。
[('A', 3), ('B', 3), ('C', 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)]
我会去:
sorted(Counter('AAABBBCCD').most_common(), key=lambda t: (-t[1], t[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']))
我首先按字母顺序对输出数组进行排序,然后按大多数事件排序,这将按字母顺序排列:
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)]
s = "BBBAAACCD"
p = [(i,s.count(i)) for i in sorted(set(s))]
**如果你没有使用计数器就可以了。
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])
from collections import Counter
print(sorted(Counter('AAABBBCCD').most_common(3)))
这个问题似乎是重复的How to sort Counter by value? - python