我有一个元组字典。
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
简而言之,我如何对字典的值进行排序和舍入,但是将它们分配给相同的键? 我认为这个问题存在于泡沫排序中,但我不确定如何纠正它,经过多次尝试后我很难看到我还能尝试什么。
修改
字典本身并不一定需要订购,因为我知道这是不可能的。 这些值需要进行排序和舍入,然后分配回它们来自的密钥(如果有意义的话)。
答案 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])