在不使用sort()函数的情况下排序“待办事项列表”

时间:2019-11-26 15:17:08

标签: python python-3.x

我有如下所示的“待办事项列表”。 我想在“ Argent Level”,“所需时间”和“ Incoming order”之后排列“ TO-DO LIST”,不使用sort()函数

# "Argent Level", "The time required" and "Incoming order"
work_list = [
             "Low_Level, 1, A.Login Error",
             "High_Level, 3, B.User info Error",
             "Nomal_Level, 1, C.Admin Error",
             "Low_Level, 2, D.Icon change of User",
             "High_Level, 3, E.Email export Error",
             "Nomal_Level, 1, F.Photo size Error",
             "High_Level, 2, G.Admin Page Error",
             "Nomal_Level, 3, H.Customer Page Error",
             "Low_Level, 1, I.Image box Error",
             "Nomal_Level, 3, J.Border Error",
             "Low_Level, 1, K.Background Color Error",
             "High_Level, 2, L.SignUp Error",
]

例如,有相同的“高级”列表,如下所示。

"High_Level, 3, B.User info Error",
"High_Level, 3, E.Email export Error",
"High_Level, 2, G.Admin Page Error",
"High_Level, 2, L.SignUp Error",

首先,我想按“所需时间”按以下顺序排列此列表,如果它们具有相同的“所需时间”,则按大写字母使用“来料顺序”按进货顺序进行下一张订单

"High_Level, 2, G.Admin Page Error",
"High_Level, 2, L.SignUp Error",
"High_Level, 3, B.User info Error",
"High_Level, 3, E.Email export Error",

我试图制作这样的代码。但这是不正确的。

high_level_list = []
nomal_level_list = []
low_level_list = []

for i in range(0, len(work_list)):
    if "High_Level" in work_list[i]:
        high_level_list.append(work_list[i])

for i in range(0, len(work_list)):
    if "Nomal_Level" in work_list[i]:
        nomal_level_list.append(work_list[i])

for i in range(0, len(work_list)):
    if "Low_Level" in work_list[i]:
        low_level_list.append(work_list[i])

for i in range(0, len(high_level_list)):
    if high_level_list[i][1] >= 3:
        temp = high_level_list[-1]
        high_level_list[-1] = high_level_list[i]
        high_level_list[i] = temp
        print(high_level_list)

我想输出如下

"High_Level, 2, G.Admin Page Error",
"High_Level, 2, L.SignUp Error",
"High_Level, 3, B.User info Error",
"High_Level, 3, E.Email export Error",

"Nomal_Level, 1, C.Admin Error",
"Nomal_Level, 1, F.Photo size Error",
"Nomal_Level, 3, H.Customer Page Error",
"Nomal_Level, 3, J.Border Error",

"Low_Level, 1, A.Login Error",
"Low_Level, 1, I.Image box Error",
"Low_Level, 1, K.Background Color Error",
"Low_Level, 2, D.Icon change of User",

1 个答案:

答案 0 :(得分:1)

首先,您需要将work_list转换为元组列表,而不只是字符串,以便可以访问各个字段,尤其是最后一步中需要的数字。

>>> work_list_tuples = [tuple(s.split(", ")) for s in work_list]

您的第一个循环应该可以工作,但是您可以根据列表理解使它们更紧凑

>>> high = [x for x in work_list_tuples if x[0] == "High_Level"]

您的最后一个循环是一种错误的插入排序,但是您可以尝试使用另一种列表理解来过滤值也为3或更高的high项,而不是试图解决该问题:

>>> high_3 = [x for x in high if int(x[1]) >= 3]

这给你

[('High_Level', '3', 'B.User info Error'),
 ('High_Level', '3', 'E.Email export Error')]

normallow级别以及低于3的high进行相同的操作,然后将列表放在一起。

>>> high_3 + high_12 + norm + low
[('High_Level', '3', 'B.User info Error'),
 ...
 ('High_Level', '2', 'L.SignUp Error'),
 ...
 ('Nomal_Level', '1', 'C.Admin Error'),
 ...
 ('Low_Level', '1', 'K.Background Color Error')]

但是,在所有远程实际应用中,我强烈建议仅将sort(列表方法)或sorted(内置函数)与适当的键功能一起使用,例如像这样:

>>> sorted(work_list_tuples, key=lambda x: ("HNL".index(x[0][0]), -int(x[1])))
[('High_Level', '3', 'B.User info Error'),
 ('High_Level', '3', 'E.Email export Error'),
 ('High_Level', '2', 'G.Admin Page Error'),
 ('High_Level', '2', 'L.SignUp Error'),
 ('Nomal_Level', '3', 'H.Customer Page Error'),
 ('Nomal_Level', '3', 'J.Border Error'),
 ('Nomal_Level', '1', 'C.Admin Error'),
 ('Nomal_Level', '1', 'F.Photo size Error'),
 ('Low_Level', '2', 'D.Icon change of User'),
 ('Low_Level', '1', 'A.Login Error'),
 ('Low_Level', '1', 'I.Image box Error'),
 ('Low_Level', '1', 'K.Background Color Error')]