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

PYTHON—如何对字典的值进行排序和舍入,但将它们分配给同一个键?,python,sorting,dictionary,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将变

我有一本元组词典

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}
这就是我想要的。但是,如果比率如下所示:

{'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}
当我的意图如下时,结果与上述相同:

{'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}
排序时,浮动的前半部分应向上舍入,而下半部分应向下舍入。 例如

导致

2, 2, 3, 4, 5
简言之,如何对字典的值进行排序和舍入,但将它们分配给同一个键? 我认为问题在于泡沫排序,但我不确定如何纠正它,在多次尝试后,我努力想看看我还能尝试什么

编辑

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

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

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

认为有一种方法可以对值进行排序,然后将它们重新分配回它们来自的键

使用internet用户建议的元组列表解决


是否要交换键和值?dict没有顺序,所以排序不会做任何事情。可能会将其转换为元组列表–internet\u用户

bubbleSort也不再需要了。它被替换为

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

我认为有一种方法可以对值进行排序,然后将它们重新分配回它们来自的键

使用internet用户建议的元组列表解决


是否要交换键和值?dict没有顺序,所以排序不会做任何事情。可能会将其转换为元组列表–internet\u用户

bubbleSort也不再需要了。它被替换为

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

是否要交换键和值
dict
s没有顺序,因此排序不会起任何作用。可能会将其转换为元组列表。是否要交换键和值
dict
s没有顺序,因此排序不会起任何作用。可能会将其转换为元组列表。我需要对值进行排序和取整,然后如果可能的话,将其分配回它们来自的字典键。我有点不清楚排序是什么意思。如果您需要对字典进行排序(即按键或值的顺序),那么对于标准python dict来说,这是不可能的,因为它们在定义上是无序的。您需要使用有序的数据类型。您可以毫无问题地编辑值(例如,对值进行舍入):dict['key']=round(dict['key'])我想从字典中获取值。比如说0.5,2,1,2.5,3。按升序对它们进行排序,以便0.5、1、2、2.5、3。然后将上半部分浮点数(0.5)向上舍入,下半部分浮点数(2.5)向下舍入。但我需要它们保持分配给同一个键。上面的代码就是这样做的,但是给不同的键赋值,这不是我想要的,比如add-0.5,sub=2,multi=1,divi=2.5,money=3。经过排序和四舍五入等操作后,结果应该是add=1、sub=2、multi=1、divi=2和money=3。上面的代码将导致add=1、sub=1、multi=2、divi=2和money=3。这是因为当您执行num_dict[keys[i]=num_dict[keys[i+1]]时,您正在将值分配给不同的键。同样,你不能对Python dict进行排序。如果你想排序,你需要使用不同的数据结构。如果可能的话,我需要对值进行排序和舍入,然后分配回它们来自的字典键。我不太清楚你所说的排序是什么意思。如果您需要对字典进行排序(即按键或值的顺序),那么对于标准python dict来说,这是不可能的,因为它们在定义上是无序的。您需要使用有序的数据类型。您可以毫无问题地编辑值(例如,对值进行舍入):dict['key']=round(dict['key'])我想从字典中获取值。比如说0.5,2,1,2.5,3。按升序对它们进行排序,以便0.5、1、2、2.5、3。然后将上半部分浮点数(0.5)向上舍入,下半部分浮点数(2.5)向下舍入。但我需要它们保持分配给同一个键。上面的代码就是这样做的,但是给不同的键赋值,这不是我想要的,比如add-0.5,sub=2,multi=1,divi=2.5,money=3。经过排序和四舍五入等操作后,结果应该是add=1、sub=2、multi=1、divi=2和money=3。上面的代码将导致add=1、sub=1、multi=2、divi=2和money=3。这是因为当您执行num_dict[keys[i]=num_dict[keys[i+1]]时,您正在将值分配给不同的键。同样,不能对Python dict进行排序。如果要排序,需要使用不同的数据结构。