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

时间:2017-04-18 05:53:24

标签: python counter python-collections

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

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

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

和NOT:

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

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

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

我怎样才能做到这一点?

7 个答案:

答案 0 :(得分:2)

这里有两个问题:

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

到目前为止,没有一个解决方案可以解决第一个问题。您可以将堆队列与Sub FilterAndCopy() Dim rng As Range, sht1 As Worksheet, sht2 As Worksheet Set sht1 = Worksheets("SHIFT LOG") Set sht2 = Worksheets("FAULTS RAISED") sht2.ListObjects(1).DataBodyRange.ClearContents With Intersect(sht1.Columns("B:BP"), sht1.ListObjects(1).DataBodyRange) .Cells.EntireColumn.Hidden = False ' unhide columns If .Parent.AutoFilterMode Then .Parent.AutoFilterMode = False 'within B:BP, column B is the first column .AutoFilter field:=1, Criteria1:="Faults Raised" 'within B:BP, Columns B:C, AC:AE, BP are referenced as .Columns A:B, AB:AD, BO Dim rngToCopy As Range Set rngToCopy = Intersect(.SpecialCells(xlCellTypeVisible), sht1.Range("A:B, AB:AD, BO:BO")) Debug.Print rngToCopy.Address rngToCopy.Copy Destination:=sht2.Cells(4, "B") .Parent.AutoFilterMode = False 'no need to delete what was never there 'within B:BP, Columns C:AA, AE:BN, BP are referenced as .Columns B:Z, AD:BM .Range("B:Z").EntireColumn.Hidden = True ' hide columns .Range("AD:BM").EntireColumn.Hidden = True ' hide columns End With End Sub unique_everseen recipe(也可以在toolz.unique之类的第三方库中使用)一起使用,以计算第n个最大计数。

然后将itertools与自定义键一起使用。

sorted

答案 1 :(得分: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)]

答案 2 :(得分:0)

我会去

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

这将对计数进行降序排序(因为它们已经存在,应该表现得更好),然后在每个相等的计数组中按名称升序进行排序

答案 3 :(得分: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']))

答案 4 :(得分: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])

答案 5 :(得分:0)

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

**如果您不使用计数器也可以。

答案 6 :(得分:-2)

from collections import Counter
print(sorted(Counter('AAABBBCCD').most_common(3)))

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