我只想按降序查找前3个不同的项。如果有决胜局,按字母顺序排序。如果有3个或更少的项目,返回不同的项目列表就足够了
所以如果我有:["a","a","b","b","c","c","c","d","d","d","d"]
的输入
输出将是["d","c","a"]
因为d有4个计数,c3计数a
和b
的频率相同,但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']
您可以使用sorted和key。试着这样做:
有了这个,你可以得到所有元素的排序顺序,先是增加计数,然后是字母顺序。然后执行此操作以仅获取一次所有元素:
您可以从
collections
使用Counter
counts.most_common()
的输出^{} 可以:
此时,
top_3
的形式为[(<entry>, <freq>)]
,例如通过列表理解从中取出第一个元素:
我们得到了
注:
我们将
sorted
列表传递给Counter
,因为否则它将根据插入顺序断开连接;排序在某种程度上强制插入顺序为字母顺序.most_common(3)
将返回最多3个元素,因此我们没有问题,例如,即使只有2个唯一的条目。例如,如果the_list = ["b", "a"]
,result
将是["a", "b"]
,即使唯一元素的数量小于3相关问题 更多 >
编程相关推荐