Как сравнить два списка и вывести разницу в одном списке

Я пытаюсь извлечь имена пользователей из файла конфигурации в список и сравнить имена пользователей с другим безопасным списком имен пользователей. Файл конфигурации выглядит следующим образом:

username Hilton privilege 15 password 0 $xxxxxxxxxxxxx
username gooduser password 0 $xxxxxxxxxxxxx
username jason secret 5 $xxxxxxxxxxxxx

Проблема с выводом не единого списка! (каждый пользователь находится в списке)

['Hilton']
['gooduser']
['jason']

Я читаю файл в один список. Затем нашел позицию «имя пользователя» и использовал перечисление, чтобы найти позицию

the_list = []

with open('config_file.txt', "r") as f:
    the_list = f.read().split()        
    print(the_list)
    find_keyword = 'username'

    secure_users = ['jason','test','admin']

for i,x in enumerate(the_list):   # search in the list
  if x=='username':               # for this keyword 'username'
     pos = i + 1                  # position of every username 

     print(the_list[pos].split())          # print all users.

#Compare secure_users[] vs the_list[] here

ожидаемый результат — это список вроде >> ['Hilton','gooduser','jason']

Чтобы я мог сравнить его со списком secure_users

Не могли бы вы сделать правильный отступ в коде

Silveris 03.07.2019 09:07

Всегда ли имя пользователя находится на второй позиции в вашем файле конфигурации? Сразу после ключевого слова username?

Silveris 03.07.2019 09:10

Да всегда Сразу после имени пользователя ключевого слова

MIYUKI NARAHARA 03.07.2019 09:11
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
95
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Сделал некоторые изменения в вашем коде,

the_list = []

with open('config_file.txt', "r") as f:
    the_list = f.read().split()        
    print(the_list)
find_keyword = 'username'

secure_users = ['jason','test','admin']

users_list = []
for i,x in enumerate(the_list):   # search in the list
    if x=='username':               # for this keyword 'username'
        pos = i + 1                  # position of every username 

        users_list.append(the_list[pos].split()[0])          # print all users
print(users_list)

Выход:

['username', 'Hilton', 'privilege', '15', 'password', '0', '$xxxxxxxxxxxxx', 'username', 'gooduser', 'password', '0', '$xxxxxxxxxxxxx', 'username', 'jason', 'secret', '5', '$xxxxxxxxxxxxx']
['Hilton', 'gooduser', 'jason']

Другое решение: (лучший способ)

with open('config_file.txt', 'r') as f:
    data = f.read().split()
    user_names = [data[i+1] for i,line in enumerate(data) if 'username' in line ]

Выход:

['Hilton', 'gooduser', 'jason']

Попробуйте следующее:

usernames = []
secure_users = ['jason','test','admin']
with open('config_file.txt', "r") as f:
    for line in f:
        usernames.append(line.split()[1])

print([user for user in secure_users if user in usernames])

Это не желаемый результат.

MIYUKI NARAHARA 03.07.2019 09:40

Использование регулярного выражения.

Бывший:

import re

find_keyword = 'username'
the_list = []
with open('config_file.txt') as f:
    for line in f:
        m = re.search(r"\b{}\b \b(.*?)\b ".format(find_keyword), line.strip())    #Search for key and word after that. 
        if m:
            the_list.append(m.group(1))

print(the_list)# ->['Hilton', 'gooduser', 'jason']

добавьте список с именем diff в свой код, например:

diff = []

затем просто добавьте ниже 2 строки после строки кода print(the_list[pos].split()):

if the_list[pos] not in secure_users:
        diff.append(the_list[pos])

затем напечатайте diff, чтобы увидеть единый список:

print(diff)

Другие вопросы по теме