8

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

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

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

并不是:

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

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

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

我怎样才能做到这一点?

4

8 回答 8

4

虽然这个问题已经有点老了,但我想提出一个非常简单的解决方案来解决这个问题,它只涉及在创建 Counter 对象本身之前对Counter()的输入进行排序。如果您随后调用most_common(n),您将获得按字母顺序排序的前n个条目。

from collections import Counter

char_counter = Counter(sorted('ccccbbbbdaef'))
for char in char_counter.most_common(3):
  print(*char)

导致输出:

b 4
c 4
a 1
于 2020-01-07T01:04:20.070 回答
2

这里有两个问题:

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

迄今为止,没有一个解决方案解决了第一个问题。您可以使用带有itertools unique_everseen配方的堆队列(也可在 3rd 方库中使用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)]
于 2018-11-05T14:10:19.667 回答
1

我将首先按字母顺序对您的输出数组进行排序,然后再按大多数出现次数进行排序,这将保持字母顺序:

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)]
于 2018-09-13T09:43:56.677 回答
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']))
于 2019-02-17T01:14:03.327 回答
0

我会去:

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

这对计数进行降序排序(因为它们已经是,这应该会更高效),然后在每个相等的计数组中按名称升序排序

于 2018-11-05T13:46:08.160 回答
0
s = "BBBAAACCD"    
p = [(i,s.count(i)) for i in sorted(set(s))]

**如果您可以不使用柜台。

于 2019-04-24T18:01:47.153 回答
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])
于 2019-03-25T16:23:28.510 回答
-2
from collections import Counter
print(sorted(Counter('AAABBBCCD').most_common(3)))

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

于 2017-04-18T06:03:02.190 回答