如何在Python中对数组进行排序和计数?

2024-10-01 22:38:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我只想按降序查找前3个不同的项。如果有决胜局,按字母顺序排序。如果有3个或更少的项目,返回不同的项目列表就足够了

所以如果我有:["a","a","b","b","c","c","c","d","d","d","d"]的输入

输出将是["d","c","a"]

因为d有4个计数,c3计数ab的频率相同,但a按字母顺序排在第一位

在MySQL中,我通常会使用:

SELECT id, COUNT(*) as frequency FROM mylist GROUP BY id ORDER BY frequency, id

在Python中如何实现这一点

我基于SAI SANTOH CHIRAG's solution使用此代码:

def main(output):
    arr = sorted(output,key=lambda i:[output.count(i),-ord(i)],reverse=True)
    out = []
    for i in arr: 
        if i not in out: out.append(i) 
        print(out[:3])

但为什么结果是这样的:

Input (stdin) = a a a b b c d d d d
output = ['d']
['d']
['d']
['d']
['d', 'a']
['d', 'a']
['d', 'a']
['d', 'a', 'b']
['d', 'a', 'b']
['d', 'a', 'b']

而不是我想要的,那就是:

['d','a','b']

Tags: 项目inid列表outputby排序顺序
3条回答

您可以使用sorted和key。试着这样做:

arr = sorted(x,key=lambda i:[x.count(i),-ord(i)],reverse=True)

有了这个,你可以得到所有元素的排序顺序,先是增加计数,然后是字母顺序。然后执行此操作以仅获取一次所有元素:

out = []
for i in arr:
    if i not in out:
        out.append(i)
print(out[:3])

您可以从collections使用Counter

from collections import Counter

inputs = ["a","a","b","b","c","c","c","d","d","d","d"]
counts = Counter(x)
counts.most_common(3)

final = [i[0] for i in counts.most_common]

counts.most_common()的输出

[('d', 4), ('c', 3), ('a', 2), ('b', 2)]

^{}可以:

the_list = ["a","a","b","b","c","c","c","d","d","d","d"]
counter = Counter(sorted(the_list))
top_3 = counter.most_common(3)

此时,top_3的形式为[(<entry>, <freq>)],例如

[('d', 4), ('c', 3), ('a', 2)]

通过列表理解从中取出第一个元素:

result = [item for item, freq in top_3]

我们得到了

['d', 'c', 'a']

注:

  1. 我们将sorted列表传递给Counter,因为否则它将根据插入顺序断开连接;排序在某种程度上强制插入顺序为字母顺序

  2. .most_common(3)将返回最多3个元素,因此我们没有问题,例如,即使只有2个唯一的条目。例如,如果the_list = ["b", "a"]result将是["a", "b"],即使唯一元素的数量小于3

相关问题 更多 >

    热门问题