PYTHON - 如何对字典的值进行排序和舍入,但是将它们分配给相同的键?

时间:2018-01-14 15:38:54

标签: python sorting dictionary

我有一个元组字典。

AddRatio=0.2
SubRatio=0.25
MultiRatio=0.2
DiviRatio=0.2
MoneyRatio=0.15

num_dict = {"add": 10*AddRatio, "sub": 10*SubRatio, "multi": 10*MultiRatio, 
            "divi": 10*DiviRatio, "money": 10*MoneyRatio}

首先,我需要从任何数字中删除.0以便稍后进行排序。例如。 2.0将变为2,而3.5将保持为3.5

在帮助下,我得到了这一行:

num_dict = {k: int(v) if v == int(v) else v for k, v in num_dict.items()}

如果有的话,我会在字典中检查浮点数:

keys=["add", "sub", "multi", "divi", "money"]

for i in range(len(num_dict)):
    if type(num_dict[keys[i]]) is float:
        sortRound()
        break

引入函数sortRound(),顾名思义,对值进行排序,然后对它们进行舍入。

到目前为止,我有这个:

def sortRound():
    global num_add_qs, num_sub_qs, num_multi_qs, num_divi_qs, num_money_qs
    global num_dict, keys

    def bubbleSort(num_dict):
        for passnum in range(len(num_dict)-1,0,-1):
            for i in range(passnum):
                if num_dict[keys[i]]>num_dict[keys[i+1]]:
                    temp = num_dict[keys[i]]
                    num_dict[keys[i]] = num_dict[keys[i+1]]
                    num_dict[keys[i+1]] = temp

    bubbleSort(num_dict)

    for i in range(0, len(num_dict)):
        j=len(num_dict)-1
        if isinstance(num_dict[keys[i]], int):
            i=i+1
        elif isinstance(num_dict[keys[i]], float):
            num_dict[keys[i]] = math.ceil(num_dict[keys[i]])
            while isinstance(num_dict[keys[j]], int):
                j=j-1
            if isinstance(num_dict[keys[j]], float):
                num_dict[keys[j]]=int(num_dict[keys[j]])

现在,就我所见,上面的代码在排序和舍入数字方面确实有效。问题是它们被分配给了错误的变量。

如果比率如下:

AddRatio=0.05
SubRatio=0.2
MultiRatio=0.2
DiviRatio=0.2
MoneyRatio=0.35

字典最终会如下:

{'add': 1, 'sub': 2, 'multi': 2, 'divi': 2, 'money': 3}

这就是我想要的。但是,如果比率如下:

AddRatio=0.2
SubRatio=0.05
MultiRatio=0.2
DiviRatio=0.2
MoneyRatio=0.35

当我的意图如下时,结果与上述相同:

{'add': 2, 'sub': 1, 'multi': 2, 'divi': 2, 'money': 3}

当排序时,浮动的前半部分应该向上舍入,而后半部分应该向下舍入,无论如何。 E.g。

1.5, 2, 3, 4.5, 5

结果

2, 2, 3, 4, 5

简而言之,我如何对字典的值进行排序和舍入,但是将它们分配给相同的键? 我认为这个问题存在于泡沫排序中,但我不确定如何纠正它,经过多次尝试后我很难看到我还能尝试什么。

修改

字典本身并不一定需要订购,因为我知道这是不可能的。 这些值需要进行排序和舍入,然后分配回它们来自的密钥(如果有意义的话)。

2 个答案:

答案 0 :(得分:2)

Python字典不是有序的,因此对它们进行排序是没有意义的。使用有序类型,如NamedTuple或OrderedDict。

答案 1 :(得分:1)

以为会有办法以某种方式对值进行排序,然后将它们重新分配给它们来自的密钥。

使用internet_user

建议的元组列表解决
  

您想要交换密钥和值吗? dicts没有订单,因此排序不会做任何事情。也许将它转换为元组列表 - internet_user

AddRatio=0.2
SubRatio=0.05
MultiRatio=0.2
DiviRatio=0.2
MoneyRatio=0.35

num_list = [["add", 10*AddRatio], ["sub", 10*SubRatio], ["multi", 10*MultiRatio], \
            ["divi", 10*DiviRatio], ["money", 10*MoneyRatio]]

#Removes .0 if required (2.0 --> 2, 3.5 --> 3.5)
#This means that the rounding works later on
for i in range(0, len(num_list)):
    num_list[i][1]=str(num_list[i][1])
    if num_list[i][1][2] == "0":
        num_list[i][1]=num_list[i][1][:1]
        num_list[i][1]=int(num_list[i][1])
    else:
        (num_list[i][1])=float(num_list[i][1])

num_list = sorted(num_list, key=lambda tup: tup[1])

def sortRound():
    global num_list 

    for i in range(0, len(num_list)):
        j=len(num_list)-1
        if isinstance(num_list[i][1], int):
            i=i+1
        elif isinstance(num_list[i][1], float):
            num_list[i][1] = math.ceil(num_list[i][1])
            while isinstance(num_list[j][1], int):
                j=j-1
            if isinstance(num_list[j][1], float):
                num_list[j][1]=int(num_list[j][1])

for i in range(len(num_list)):
    if type(num_list[i][1]) is float:
        sortRound()
        break

不再需要bubbleSort。它被

取代
num_list = sorted(num_list, key=lambda tup: tup[1])