Python Collection Counter.most_common(n)
方法返回前n个元素及其计数。但是,如果两个元素的计数相同,我如何返回按字母顺序排序的结果?
例如:对于像BBBAAACCD
这样的字符串,对于“最常见的2个”元素,我希望结果是针对指定的n = 2
:
[('A', 3), ('B', 3), ('C', 2)]
和NOT:
[('B', 3), ('A', 3), ('C', 2)]
请注意,虽然A
和B
具有相同的频率,但A
位于结果列表中的B
之前,因为它按字母顺序排在B
之前
[('A', 3), ('B', 3), ('C', 2)]
我怎样才能做到这一点?
答案 0 :(得分: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