Сортировка списка пользователей по дате и времени с отсутствующими датами в Python - PullRequest
1 голос
/ 09 июня 2019

У меня есть список пользователей с несортированными соответствующими датами.Однако некоторые пользователи в списке не имеют даты и времени.

Этот список имеет следующий формат:

user1   04-24 19:01:00
user2   04-25 06:39:59
user3
user4   04-24 22:11:34
user5
user6
user7   04-26 10:27:36
user8   04-25 06:09:01

И я хочу отсортировать список следующим образом:

user1   04-24 19:01:00
user4   04-24 22:11:34
user8   04-25 06:09:01
user2   04-25 06:39:59
user3
user5
user6
user7   04-26 10:27:36

По сути, сохраняйте пустые даты в одной и той же позиции в максимально возможной степени (т. Е. Если существующая дата находится под пустой датой, она не может идти вверх, если только дата больше ее даты не существует над пустой).

Дата и время изменены в формате ISO 8601.

Если бы у меня было все время, я мог бы отсортировать список следующим образом:

user_lst.sort(key=lambda date: datetime.strptime(date[len(date)-14:], '%m-%d %H:%M:%S'))

Однако, поскольку у меня есть строки без даты и времени, я не знаю, как я смогу отформатировать их так, как я хочу.

1 Ответ

1 голос
/ 09 июня 2019

В этом случае вы можете игнорировать все элементы, которые имеют '' в качестве даты, и просто сравнить остальные из них.Если у элемента более поздняя дата, чем у другого, вставьте его прямо перед другим элементом и полностью удалите его из прежней позиции.На каждом шагу вы должны проверять, отсортирован ли список и если он есть, то сломайте.Код ниже демонстрирует эту концепцию:

import time

# Print list.
def printList(inList):
    for elem in inList:
        print(elem[0] + ' ' + elem[1])
    print()

# Check if list is sorted.
def isSorted(inList):
    length = len(inList)
    for i in range(length-1):
        if inList[i][1] != '' and inList[i+1][1] != '':
            date1 = time.strptime(inList[i][1], '%m-%d %H:%M:%S')
            date2 = time.strptime(inList[i+1][1], '%m-%d %H:%M:%S')
            if date1 > date2:
                return False
    return True

# Sort list.
def sortList(inList):
    length = len(inList)
    for i in range(length):
        if inList[i][1] == '':
            continue
        for j in range(length-1,0,-1):
            if inList[j][1] == '':
                continue
            if i != j:
                date1 = time.strptime(inList[i][1], '%m-%d %H:%M:%S')
                date2 = time.strptime(inList[j][1], '%m-%d %H:%M:%S')
                if date2 < date1:
                    currentElem = inList[j]
                    inList.remove(inList[j]) 
                    inList.insert(i,currentElem)
        if isSorted(inList):
            break
    return inList


inList = [['user1', '04-24 19:01:00'], ['user2', '04-25 06:39:59'], ['user3', ''], ['user4', '04-24 22:11:34'], ['user5', ''], ['user6', ''], ['user7', '04-26 10:27:36'], ['user8', '04-25 06:09:01']]
inList = sortList(inList)
printList(inList)

Вывод:

user1 04-24 19:01:00
user4 04-24 22:11:34
user8 04-25 06:09:01
user2 04-25 06:39:59
user3 
user5 
user6 
user7 04-26 10:27:36
...