【问题标题】:How to sort a list in order of weekdays in python? [duplicate]如何在python中按工作日顺序对列表进行排序? [复制]
【发布时间】:2021-04-18 07:54:35
【问题描述】:

我有一个元组列表,看起来像这样:

lst = [(2921, 'string', 1, 1, 7), (2922, 'string', 2, 1, 1), (2923, 'string', 3, 1, 4),
        (2924, 'string', 4, 2, 2), (2925, 'string', 5, 2, 3), (2926, 'string', 6, 2, 5),
        (2927, 'string', 7, 2, 3), (2928, 'string', 8, 3, 4), (2929, 'string', 9, 3, 4),
        (2930, 'string', 10, 3, 5), (2931, 'string', 11, 3, 5), (2932, 'string', 12, 4, 6),
        (2933, 'string', 13, 4, 6), (2934, 'string', 14, 4, 7), (2935, 'string', 15, 7, 1),
        (2936, 'string', 16, 5, 1), (2937, 'string', 17, 5, 2)]

每个元组中的最后一个元素(第五项)对应于星期几,编号为 1 到 7。

我会对列表进行排序,以便生成的元组按升序在一周中的天数中循环,如下所示:

  1. 用 1 选择第一个元组,然后用 2 选择第一个元组,直到 7(如果没有具有该编号的元组,则跳过编号)
  2. 用 2 选择第二个元组,然后用 3 选择第二个元组,直到再次达到 7。
  3. 继续这个循环过程(即第一个、第二个、第三个等),直到用完元组。

期望的输出:

(2922, 'string', 2, 1, 1)
(2924, 'string', 4, 2, 2)
(2925, 'string', 5, 2, 3)
(2923, 'string', 3, 1, 4)
(2926, 'string', 6, 2, 5)
(2932, 'string', 12, 4, 6)
(2921, 'string', 1, 1, 7)
(2935, 'string', 15, 7, 1)
(2937, 'string', 17, 5, 2)
(2927, 'string', 7, 2, 3)
(2928, 'string', 8, 3, 4)
(2930, 'string', 10, 3, 5)
(2933, 'string', 13, 4, 6)
(2934, 'string', 14, 4, 7)
(2936, 'string', 16, 5, 1)
(2929, 'string', 9, 3, 4)
(2931, 'string', 11, 3, 5)

我尝试使用自定义排序功能,但它没有按我的需要工作:

days = [1, 2, 3, 4, 5, 6, 7]

sorted_list = sorted(list, key=lambda x: (x[4], days.index))

for i in sorted_list:
    print(i)

也许“排序”实际上并不是正确的术语。无论如何,我想根据元组的第五个元素对列表元素进行排序。我想像工作日一样订购它们:从周一到周日,周日之后又是周一。所以,从 1 到 7,然后再从 1 到 7。像这样:1、2、3、4、5、6、7、1、2、3、4、5、6、7、1、2 ...

不是 1、1、2、2、2、3、3 ...

【问题讨论】:

  • 1.你的 lambda 中的“days.index”是什么意思(没有参数的.index)? 2. 为什么你首先需要它。您的“天”列表已排序值。
  • 不要将您的列表命名为“列表”。这应该是一个保留字,是混淆的根源。至于排序 - 你必须清楚你想要什么。假设您有一个工作日列表,即 [1,1,2,2,3,4,5,3,2]。你期望什么输出?
  • 你想要的输出没有排序 - 为什么(2935, 'string', 15, 7, 1),在(2921, 'string', 1, 1, 7)之后等等......
  • 您在 12 小时前问了几乎完全相同的问题。不要重新发布已关闭的问题,而是尝试通读How to Ask 并将其编辑成形状。 “但它没有按我的需要工作”不足以作为问题描述
  • @PaulUheet 查看解决方案并让我知道任何其他问题,请按照所有必要的指南提出问题

标签: python python-3.x list sorting


【解决方案1】:

Dict 对象是解决此问题的数据结构之一。 查看此代码:

list_ = [(2921, 'string', 1, 1, 7), (2922, 'string', 2, 1, 1), (2923, 'string', 3, 1, 4),
        (2924, 'string', 4, 2, 2), (2925, 'string', 5, 2, 3), (2926, 'string', 6, 2, 5),
        (2927, 'string', 7, 2, 3), (2928, 'string', 8, 3, 4), (2929, 'string', 9, 3, 4),
        (2930, 'string', 10, 3, 5), (2931, 'string', 11, 3, 5), (2932, 'string', 12, 4, 6),
        (2933, 'string', 13, 4, 6), (2934, 'string', 14, 4, 7), (2935, 'string', 15, 7, 1),
        (2936, 'string', 16, 5, 1), (2937, 'string', 17, 5, 2)]


days = [1, 2, 3, 4, 5, 6, 7]

dict_sort_ = {f'{i}':[j for j in list_ if j[-1] == i] for i in days}

condn = True
day = 1
while  condn:
    try:    
        print(dict_sort_[str(day)][0])
        dict_sort_[str(day)].pop(0)
        if day >= 7:
            day %= 7
    except:
        continue
    finally:
        day += 1
    if all([True if len(dict_sort_[i])==0 else False for i in dict_sort_]):
        condn = False

输出:

(2922, 'string', 2, 1, 1)
(2924, 'string', 4, 2, 2)
(2925, 'string', 5, 2, 3)
(2923, 'string', 3, 1, 4)
(2926, 'string', 6, 2, 5)
(2932, 'string', 12, 4, 6)
(2921, 'string', 1, 1, 7)
(2935, 'string', 15, 7, 1)
(2937, 'string', 17, 5, 2)
(2927, 'string', 7, 2, 3)
(2928, 'string', 8, 3, 4)
(2930, 'string', 10, 3, 5)
(2933, 'string', 13, 4, 6)
(2934, 'string', 14, 4, 7)
(2936, 'string', 16, 5, 1)
(2929, 'string', 9, 3, 4)
(2931, 'string', 11, 3, 5)

【讨论】:

  • 问题的最后一行给出了所有工作的重点我引用它“像这样:1、2、3、4、5、6、7、1、2、3、4、5,六、七、一、二……”
  • 这意味着用户希望以这样一种方式迭代从周一到周日的形式,这样两天都不应该在一起
  • 是的,Exploore X,你是对的,这正是我想要的。谢谢!抱歉,如果问题不够清楚。我想知道,这是最有效的方法吗?如果列表有数千个项目,它可能会很慢..
  • @PaulUheet 现在我更新了我的解决方案,以前它包含一些错误的逻辑,现在终于更正了。
  • @PaulUheet 如果您也有任何与此相关的问题,请告诉我
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 2013-12-06
相关资源
最近更新 更多