Python: сохранить только самый новый логин в файл

#python #list

#python #Список

Вопрос:

У меня есть этот проект, в котором мне нужно обработать большие журналы доступа и получить список с последней попыткой входа для всех пользователей. При обработке журналов я дошел до того, что у меня появилось что-то вроде этого:

 [user1, <last login recorded>, <current login>]
[user2, <no last login recorded>, <current login>]
[user1, <last login recorded>, <current login>]
[user3, <last login recorded>, <current login>]
 

Как вы видите, у одного и того же пользователя записано несколько логинов. И я хотел бы получить только самый новый логин для окончательного списка.

Я использую объекты datetime для входа в систему, поэтому сравнить текущий с последним легко, но мой вопрос: как я могу временно сохранить текущий новейший логин и сравнить его со следующим?

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

 final_list = []
for login in log_file:
    login = login.split(';')
    last_login = get_last_login() #ldap search for the user last login
    if last_login:
        final_list.append([login[0], last_login, login[1]])
    else:
        final_list.append([login[0], 'no_last_login_recorded', login[1]])
 

Итак, если я добавляю каждый логин в final_list[], есть ли способ проверить, есть ли пользователь уже там, и сравнить текущий логин с тем, который в списке?

Комментарии:

1. Немного не по теме, но lastlog в большинстве дистрибутивов Linux есть команда с именем, которая выводит время последнего входа для всех пользователей.

2. @FlorinStingaciu Полезно знать, но здесь я работаю с файлами доступа ldap. В любом случае спасибо.

3. Просто используйте словарь, введенный пользователем — последняя запись выигрывает

4. @gkusner Не могли бы вы привести пример того, как это сделать?

Ответ №1:

Как указал @gkunser, вы можете просто использовать dictionary ( {} ), привязанный к пользователю, примерно так:

 final_list = {}
for login in log_file:
    login = login.split(';')
    last_login = get_last_login();
    if last_login:
       final_list[login[0]] = (last_login, login[1]])
    ...
 

Таким образом, вы автоматически перезапишете информацию для входа пользователя

[Этот псевдокод использовался для указания неверного набора]

Комментарии:

1. Я пытаюсь повторить это, но получаю «TypeError: объект ‘set’ не поддерживает назначение элемента»

2. Видя @gkusner выше, я думаю, вы могли бы использовать словарь (final_list = {}) вместо Set . Я не знаю, почему я думал, что вам нужен набор. Установите здесь.

3. Извините за мой поздний ответ, но после переосмысления этого метода я понимаю, что словарь — это именно то, что мне нужно.