【问题标题】:Sort dictionary, then sort it with another排序字典,然后用另一个排序
【发布时间】:2021-09-04 08:11:42
【问题描述】:

我有一本按点(只是数字)排序的字典。如果字典中的两个点相等,我想使用另一个具有相同键但其他数字(目标)的字典。因此,当分数相等时,我想对两个相等的元素进行排序,以使目标较多的元素排在另一个目标较少但分数相等的元素之前。这不得影响列表中具有不同点的其他元素。

这里是现在的代码:

import random
sorted_dict = {}
dict = {"t": 5, "m": 3, "s": 4, "d": 8}
dict_keys_points_2 = []
dict_keys_points = dict.keys()

for element in dict_keys_points:
    dict_keys_points_2.append(element)

sorted_values = sorted(dict.values(), reverse=True)

for i in sorted_values:
    for k in dict_keys_points_2:
        if dict[k] == i:
            sorted_dict[k] = dict[k]
            dict_keys_points_2.remove(k)
            break
dict_points = {}
dict_keys_unsorted = dict.keys()
a = sorted_dict.keys()
for element in a:
    dict_keys.append(element)
for element in dict_keys:
    dict_points[element] = random.randint(0, 5)

输出:

{'d': 2, 't': 4, 's': 0, 'm': 4} #(the goals)  
{'d': 8, 't': 5, 's': 4, 'm': 3} #(the points)

所以如果有两个元素具有相同的点,我想看看目标并对这两个元素进行排序: 即:

{'d': 8, **'t': 5, 's': 5,** 'm': 3} #<-- two same points
{'d': 2, **'t': 0**, **'s': 4,** 'm': 4} #<-- s has more goals 
#so after that the dictionary should look like this:
{'d': 8, **'s'**: 5, **'t'**: 5, 'm': 3}

【问题讨论】:

  • 目前这个问题有点含糊,你能提供一些示例输入和它们各自的输出吗?
  • 避免使用dict作为变量名。
  • 不要使用关键字来实例化变量或对象。将 dict 更改为其他内容。见stackoverflow.com/questions/37968516/…
  • 好吧,这只是我实际代码中的一个测试页面,还有另一个名字
  • 在您问题的代码中,具有相同键但其他数字(目标)的其他字典在哪里?请提供与您要执行的操作的描述相匹配的代码。

标签: python python-3.x sorting dictionary


【解决方案1】:

我可以创建一个新的字典,其中包含点和目标作为字典中的“值”元组。然后我可以对这些“值”使用正常排序。如果第一个值发生冲突,则元组中的第二个值(即目标)将用于对其进行排序。

from collections import OrderedDict

goals = {'d': 2, 't': 4, 's': 8, 'm': 4}
points = {'d': 8, 't': 5, 's': 5, 'm': 3}

new_dict = {k: (v, goals[k]) for k, v in points.items()}
# new_dict = {'d': (8, 2), 't': (5, 4), 's': (5, 8), 'm': (3, 4)}

sorted_list = sorted(new_dict.items(), key=lambda x: x[1], reverse=True)
# sorted_list = [('d', (8, 2)), ('s', (5, 8)), ('t', (5, 4)), ('m', (3, 4))]

# Discard the goals from the values tuple to get the original, but sorted dict.
sorted_dict = OrderedDict([(i[0], i[1][0]) for i in sorted_list])
# OrderedDict([('d', 8), ('s', 5), ('t', 5), ('m', 3)])

【讨论】:

    猜你喜欢
    • 2010-11-18
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多