gpt4 book ai didi

python - 基于python中的频率和位置排序

转载 作者:太空宇宙 更新时间:2023-11-04 09:44:19 24 4
gpt4 key购买 nike

我试过这段代码用于输入

3 2 4 6 2 4 3 3 4 5 6 3 2 4 5 5 3

import collections
numbers = input().strip().split(" ")
counter = collections.Counter(numbers)
sorted_list = sorted(counter.most_common(), key=lambda x: -x[1])
ans = [(v * n) for (v, n) in sorted_list]
for i in ans:
print(" ".join(i),end=" ")

当我运行这个方法时

有时我会...

3 3 3 3 3 4 4 4 4 2 2 2 5 5 5 6 6

(这是我所期望的——首先根据频率对它们进行排序,然后根据它们在输入中出现的顺序进行排序)

有时我会...

3 3 3 3 3 4 4 4 4 5 5 5 2 2 2 6 6 

本质上问题出现在相同的频率数上

我做错了什么?

最佳答案

重大更新

我同意 MoxieBall's answer .问题可能出在 Counter 对象上。

看起来 OrderedDict 可以做一份工作,但您需要在代码中遍历数字。可能有更好的方法来做到这一点,但下面的代码应该会产生您正在寻找的东西。

from collections import OrderedDict
numbers = "3 2 4 6 2 4 3 3 4 5 6 3 2 4 5 5 3".strip().split(" ")
counter = OrderedDict()
for n in numbers:
counter[n] = counter[n]+1 if n in counter else 1
sorted_list = sorted(counter.items(), key=lambda x:-x[1] )
print sorted_list
ans = [ v*n for v,n in sorted_list]
print ans
for i in ans:
print " ".join(i)

输出就是这样,永远不会翻转。

[('3', 5), ('4', 4), ('2', 3), ('5', 3), ('6', 2)]                                                                                                                                                                                                                              
['33333', '4444', '222', '555', '66']
3 3 3 3 3
4 4 4 4
2 2 2
5 5 5
6 6

为了仔细检查它是否按出现顺序排列,让我们交换字符串中的前 2 位和后 5 位。对于字符串“3 5 4 6 2 4 3 3 4 5 6 3 2 4 5 2 3”,输出如下:

[('3', 5), ('4', 4), ('5', 3), ('2', 3), ('6', 2)]                                                                                                                                                                                                                              
['33333', '4444', '555', '222', '66']
3 3 3 3 3
4 4 4 4
5 5 5
2 2 2
6 6

如果你的字符串很长,你需要找到一个更好的方法来填充OrderedDict

关于python - 基于python中的频率和位置排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50397137/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com