【问题标题】:Sort a list by value of a dict python按字典 python 的值对列表进行排序
【发布时间】:2021-08-25 15:20:21
【问题描述】:

我需要一些帮助,如何使用算法选择排序按字典的值对列表进行排序。我写了一些代码,但我不知道如何继续,代码可以工作。

months = {"January": 1, "February": 2, "March": 3, "April": 4, "May": 5, "June": 6, "July": 7, "August": 8, "September": 9, "October": 10, "November": 11, "December": 12}

L = ["March", "January", "December"]

例如按字典的值对列表进行排序

def month(L):
    for i in months:
       minpos = i
       for j in range (months[i], len(L)):
           if months[L[j]] > months[minpos]:
             months[minpos] = months[L[j]]

       L[j], L[minpos] = L[minpos], L[i] 

return L

【问题讨论】:

  • 你能解释一下你在上面的代码中试图做什么。还提供预期的输出。
  • 你不应该循环遍历months字典,你应该循环遍历L。
  • 例如L = ["March", "January", "December"] 并输出排序列表 ["January", "March", "December"]。按 dict 月份的值排序。

标签: python sorting dictionary selection


【解决方案1】:

新答案

  • 创建具有get_sorted() 方法的类selection_sort,该方法将使用选择排序根据字典值对列表进行排序。
  • 这里我们比较两个值,如果第一个值大于第二个值,则交换两个值。重复此步骤,直到对整个列表进行排序。

class selection_sort:
    """Sort the list based on dictionary value using selection sort."""
    def __init__(self,L):
        self.months = {"January": 1, "February": 2, "March": 3, "April": 4,
                   "May": 5,
                  "June": 6, "July": 7, "August": 8, "September": 9,
                  "October": 10, "November": 11, "December": 12}
        self.L = L

    def get_sorted(self):
        """ sorting list."""
        month_num =  [self.months[i] for i in self.L]
        flag = True  # set Flag is True to enter the loop.
        while flag:
            flag = False  # set Flag to False for no swaping done

            for i in range(len(month_num)-1):
                if month_num[i] > month_num[i+1]:
                    flag = True  # set Flag to False if no swaping is done
                    # swap
                    month_num[i], month_num[i+1] = month_num[i+1], month_num[i]

        L = [k for k, v in self.months.items() if v in month_num]
        print(L)
        return L

测试用例

  • 您编写的测试是将L 与Expected 进行比较。它应该将actual 与expected 进行比较。 self.assertEqual(L, expected)

  • 另外,预期 = ["March", "May", "December", "October", "September"] 不正确。应该是["March", "May","September", "October", "December"]

import unittest
from selectionSort import selection_sort

# @unittest.skip("")
class TestInPlace(unittest.TestCase):
    def test_1(self):
        L = ["December", "September", "March", "October", "May"]
        obj = selection_sort(L)
        actual = obj.get_sorted()
        expected = ["March", "May","September", "October", "December"]
        self.assertEqual(actual, expected)

旧答案

试试这个,

#creating list L1
L1 = [months[L[i]] for i in range(len(L))]
print(L1)

#sorting list using algorithm selection sort
for i in range(1,len(L1)):
    j = 0
    if L1[j] > L1[i] :
        L1[j], L1[i] = L1[i] ,L1[j]
print(L1)

#Replacing values with key
sorted_list = [ k   for k,v  in months.items() for i in L1 if i == v]
print(sorted_list)

【讨论】:

  • 代码工作正常,但我缺少一个问题,例如如果输入是:L = ["March", "March", "May", "April", "September"],那么输出是 ['March', 'April', 'May', 'September'] .但我也希望列表中的所有给定月份仍然可用,例如:['March', 'March' , 'April', 'May', 'September']
  • 代码运行良好,直到第一次测试。那里失败了。 # @unittest.skip("") class TestInPlace(unittest.TestCase): def test_1(self): L = ["December", "September", "March", "October", "May"] actual = selectionSort( L) 预期 = [“三月”、“五月”、“十二月”、“十月”、“九月”] self.assertEqual(L, 预期)
  • 请查看上面的代码,让我知道您需要任何进一步的帮助。
【解决方案2】:

您的代码:

months = {"January": 1, "February": 2, "March": 3, "April": 4, "May": 5, "June": 6, "July": 7, "August": 8, "September": 9, "October": 10, "November": 11, "December": 12}
L = ["March", "January", "December"]

将L中的月份名称(str)转换为对应的数字,然后排序。

num_L = sorted( [months[month] for month in L] )

将排序后的数字转换为对应的月份名称。

res = [k for number in num_L for k,v in months.items() if number == v]

在匹配月份名称之前,您可能需要一些字符串操作,例如大写()或小写()。

【讨论】:

  • 问题是关于实现选择排序算法。使用内置的sorted 可能是作弊。
  • 谢谢你的回答,我知道那个解决方案^^但是我想用选择排序算法解决它而不使用sort(ed)函数
猜你喜欢
  • 1970-01-01
  • 2011-02-22
  • 2010-11-15
  • 2019-12-30
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多