基于日期元素,用Python对列表进行排序

3

我有三个列表。目前我正在使用一个列表来对所有列表进行排序,方法如下:

sorted_lists = sorted(zip(new_date_list, flipkart_sale_list, paytm_sale_list), key=lambda x: x[0])
new_date_list, flipkart_sale_list, paytm_sale_list = [[x[i] for x in sorted_lists] for i in range(3)]

新的日期列表包含以%b %d格式表示的日期字符串作为元素。
new_date_list = ['Feb 01', 'Feb 02', 'Jan 04', 'Jan 05', 'Jan 06', 'Jan 07']
flipkart_sale_list = [5000,4000,3000,6000,1000,9000]
paytm_sale_list = [2200,2500,3500,5000,4000,1000]

然而,以上代码无法正确排序日期字符串。那么如何根据new_date_lists对所有列表进行排序?

另外两个列表包含数字。

期望结果:

new_date_list = ['Jan 04', 'Jan 05', 'Jan 06', 'Jan 07', 'Feb 01', 'Feb 02']
flipkart_sale_list = [3000,6000,1000,9000,5000,4000]
paytm_sale_list = [3500,5000,4000,1000,2200,2500]

你期望的结果和你的语句“如何根据new_date_lists对所有列表进行排序”是矛盾的。你真正想要什么?是根据new_date_list对所有列表进行排序,还是分别对所有列表进行排序? - Muhammad Tahir
2个回答

4

在排序之前将其转换为日期时间对象。尝试使用

sorted_lists = sorted(zip(new_date_list, flipkart_sale_list, paytm_sale_list), key=lambda x: datetime.datetime.strptime(x[0], "%b %d"))
new_date_list, flipkart_sale_list, paytm_sale_list = [[x[i] for x in sorted_lists] for i in range(3)]

结果:

>>> new_date_list
['Jan 04', 'Jan 05', 'Jan 06', 'Jan 07', 'Feb 01', 'Feb 02']
>>> flipkart_sale_list
[1000, 9000, 5000, 4000, 3000, 6000]
>>> paytm_sale_list
[4000, 1000, 2200, 2500, 3500, 5000]

正如@StefanPochmann所建议的,这个

new_date_list, flipkart_sale_list, paytm_sale_list = [[x[i] for x in sorted_lists] for i in range(3)]

也可以通过压缩包来完成

new_date_list, flipkart_sale_list, paytm_sale_list = map(list, zip(*sorted_lists))

为什么第二部分也不使用zip - Stefan Pochmann
@StefanPochmann 是的,我先这样做了,然后我改变了结果以匹配 OP 的代码。 - Muhammad Tahir
这里不需要使用 map,"star expression" 可以与可迭代对象一起使用。 new_date_list, flipkart_sale_list, paytm_sale_list = zip(*sorted(zip(new_date_list, flipkart_sale_list, paytm_sale_list), key=lambda x: datetime.strptime(x[0], "%b %d"))) - styvane
@user3100115 是的,它可以!但是它返回元组列表。OP 的期望结果中有列表,所以我添加了 map(list) 来将元组转换为列表。 - Muhammad Tahir
@MuhammadTahir 是的,但坦率地说,我认为将排序结果转换为列表没有任何意义。最好将排序后的元组作为结果发布,然后告诉OP如果需要使用maptuple转换为list。此外,您不需要sorted_lists变量。最后但并非最不重要的:从您的答案中删除第一行中的try - styvane

0

我并没有真正理解这3个列表的目的,但如果你有一个大列表,可以用这个技巧。

import datetime

sorted(new_date_list, key=lambda x: datetime.datetime.strptime(x, '%b %d'))

**编辑-在您添加列表数据示例后-我会进行3次排序


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接