<p>请注意,这会将日期时间字符串转换为<code>datetime.datetime</code>对象。这可能是可取的,也可能不是可取的,但如果您计划执行涉及这些日期的任何其他操作,则至少建议您这样做。如果您真的希望它们作为字符串,请参阅注释的代码行</p>
<p>另外请注意,我假设您的日期为<code>dd/mm/yyyy</code>。如果它们是<code>mm/dd/yyyy</code>,则需要在<code>DATETIME_FORMAT</code>中切换<code>%d</code>和<code>%m</code></p>
<pre class="lang-py prettyprint-override"><code>import datetime
import itertools
from operator import itemgetter as get
# Assumes day/month/year, switch %d and %m if not
DATETIME_FORMAT = "%d/%m/%Y %I:%M:%S %p"
def parse_datetimes(data: list) -> list:
result = []
for first, second, timestamp, rank in data:
timestamp = datetime.datetime.strptime(timestamp, DATETIME_FORMAT)
result.append([first, second, timestamp, rank])
return result
def custom_sort(data: list) -> list:
# Convert datetime strings to datetime objects, then sort by first element
sorted_data = sorted(parse_datetimes(data), key=get(0), reverse=True)
# Re-rank each group sorted by date
result = []
for _, group in itertools.groupby(sorted_data, key=get(0)):
ranked_group = []
sorted_group = sorted(group, key=get(2))
for rank, (*item, _) in enumerate(sorted_group, 1):
# item[2] = item[2].strftime(DATETIME_FORMAT)
ranked_group.append([*item, f"Rank:{rank}"])
result.extend(ranked_group[::-1])
return result
</code></pre>
<p>演示:</p>
<pre class="lang-py prettyprint-override"><code>>>> custom_sort(ArrayData)
[['d', 'ssss', datetime.datetime(2021, 10, 2, 11, 39, 19), 'Rank:1'],
['b', 'esas', datetime.datetime(2021, 10, 2, 6, 25, 20), 'Rank:2'],
['b', 'db', datetime.datetime(2021, 10, 2, 6, 25, 20), 'Rank:1'],
['a', 'aser', datetime.datetime(2021, 10, 2, 9, 39, 19), 'Rank:3'],
['a', 'ad', datetime.datetime(2021, 10, 2, 7, 39, 19), 'Rank:2'],
['a', 'sd', datetime.datetime(2021, 10, 2, 5, 39, 19), 'Rank:1']]
</code></pre>