如何在python中按索引顺序排列另一个排序列表的列表?

时间:2015-06-30 16:09:21

标签: python list

我有两个清单说,

dates=['4/21/2015', '10/14/2014', '9/16/2014', '7/10/2014', '8/11/2014', '8/3/2014', '7/20/2014', '7/6/2014', '4/21/2015', '4/21/2015']
events=[a,b,c,d,e,f,g,h,i,j]

我按时间顺序对列表日期进行了排序,并将值列入了日期date1

dates1=['7/6/2014', '7/10/2014', '7/20/2014', '8/3/2014', '8/11/2014', '9/16/2014', '10/14/2014', '4/21/2015', '4/21/2015', '4/21/2015']

现在我如何以与date1相同的时间顺序排列事件?

3 个答案:

答案 0 :(得分:2)

最简单的方法是将zip两个列表放在一起,然后根据dates数组的日期转换对它们进行排序。

示例 -

>>> from datetime import datetime
>>> dates=['4/21/2015', '10/14/2014', '9/16/2014', '7/10/2014', '8/11/2014', '8/3/2014', '7/20/2014', '7/6/2014', '4/21/2015', '4/21/2015']
>>> events=['a','b','c','d','e','f','g','h','i','j']
>>> s =  sorted(zip(dates, events), key = lambda x: datetime.strptime(x[0],'%m/%d/%Y'))
>>> s
[('7/6/2014', 'h'), ('7/10/2014', 'd'), ('7/20/2014', 'g'), ('8/3/2014', 'f'), ('8/11/2014', 'e'), ('9/16/2014', 'c'), ('10/14/2014', 'b'), ('4/21/2015', 'a'), ('4/21/2015', 'i'), ('4/21/2015', 'j')]

然后,您可以使用列表推导将事件列表排序为 -

>>> sortedevents = [x[1] for x in s]
>>> sortedevents
['h', 'd', 'g', 'f', 'e', 'c', 'b', 'a', 'i', 'j']

zip函数的作用是将它提供给它的列表(迭代)中相同索引的元素组合成一个元组列表(每个元组在第i个位置包含第i个元素的组合)从参数中提供的列表中的位置。

答案 1 :(得分:0)

这样做:

sortedevents = sorted(zip(dates, events), key = lambda i: dates1.index(i[0]))

首先,我们将日期和事件组合到匹配的元组中,然后使用排序列表dates1

对元组进行排序

单独获取事件的排序列表:

events = [e[1] for e in sortedevents]

Anand的答案可能是首选,因为它不需要单独排序的日期列表,即无需dates1

答案 2 :(得分:0)

另一种方法是使用numpy的argsort函数,但它要求你将事件列表转换为数组。

import numpy as np
from datetime import datetime

dates = ['4/21/2015', '10/14/2014', '9/16/2014', '7/10/2014', '8/11/2014', '8/3/2014', '7/20/2014', '7/6/2014', '4/21/2015', '4/21/2015']
events = np.array(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'])

datetimes = [datetime.strptime(date, '%m/%d/%Y') for date in dates]
events_sorted = events[np.argsort(datetimes)]

print(events_sorted)