#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. Извините за мой поздний ответ, но после переосмысления этого метода я понимаю, что словарь — это именно то, что мне нужно.