如何在python中按工作日的顺序对列表进行排序



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

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,7,2。。。

不是1,1,2,2,3,3。。。

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)

最新更新