@pstbin

Python 3.8 Как правильно организовать сравнение?

Добрый день.

Есть вопрос, мне кажется, что он не особо сложный, но чёткого ответа я не нашёл, примеров миллион, да всё не то. Может я не правильно спрашиваю, потому пишу вам.

Есть у меня два списка, список 2 («list2»), может быть совсем пустым:
list1 = [‘one’, ‘two’, ‘three’, ‘six’]
list2 = [‘one’, ‘two’, ‘four’]

я хочу сравнить оба списка и если элемент из первого списка есть во втором, то я хочу этот элемент поместить в переменную «А», а если же нет такого элемента, то поместить искомый элемент в переменную «А1». Ну и так для всех элементов первого списка, только там, соответственно, если ДА, то в «В», если НЕТ, то в «В1» и т.д..

Подскажите пожалуйста, как это организовать.

Python 3.8

Дополнение:
Вот всё, что я хотел сделать и как это сейчас работает, может это прояснит ситуацию полностью.
Это нужно для мониторинга.
У меня есть определённая команда, которая выполняется на определённом сервере (все подробности приведу в коде ниже), команда эта получает список подключенных компонентов к серверу. Выглядит это так: “
компонент1
компонент2
компонент3
компонент4
компонент5”
В идеале их должно быть пять (это значит, что сервер работает правильно), но может быть и ноль.
после выполнения команды, я хочу взять полученный список (список2) и сверить его со списком для идеального состояния (список1). Далее, для каждого члена “списка1”, может существовать два состояния, он либо есть в “списке2”, либо нет, но в любом случае я должен получить результат сравнения этого элемента в отдельную переменную. Почему именно в отдельную переменную, потому как мне дальше необходимо передать состояние каждого компонента отдельно на систему мониторинга. Списком передавать нельзя, система не понимает, что с этим делать, она воспримет этот список как одно значение.
Так же, система мониторинга, в зависимости от полученного состояния компонента, выполняет разные действия, например: если “компонент1” отсутствует, значит система мониторинга сообщает об этом на почту и запускает команду на перезапуск “компонента1”.
Вот собственно код моего решения, которое, в принципе, работает как я хочу, но этот вариант очень плохой.
import subprocess
#list1 = ['компонент1', 'компонент2', 'компонент3', 'компонент4', 'компонент5']
list2 = subprocess.getoutput("echo dump | nc localhost 2320 | tr -s '/' | cut -f 4 -d '/' | tr -s '#' | cut -f 2 -d '#' | sort | uniq -d'")
for i in list2:
  if 'компонент1' in list2:
    comp1 = 'компонент1'
  else:
    comp1 = 'not in list'		
  if 'компонент2' in list2:
    comp2 = 'компонент2'
  else:
    comp2 = 'not in list'		
  if 'компонент3' in list2:
    comp3 = 'компонент3'
  else:		
    comp3 = 'not in list'
if 'компонент4' in list2:
    comp4 = 'компонент4'
  else:		
    comp4 = 'not in list'
if 'компонент5' in list2:
    comp5 = 'компонент5'
  else:		
    comp5 = 'not in list'
print(f"comp1: {comp1}\ncomp2: {comp2}\ncomp3: {comp3}\ncomp4: {comp4}\ncomp5: {comp5}\n")


Вы можете подумать, что раз меня устраивает этот вариант, то можно так и оставить и не морочить никому голову, но нет, мне бы хотелось, всё таки, сделать именно автоматическое сравнение двух списков, с последующей передачей состояния каждого компонента, потому как у меня есть и другие команды, которые получают другие списки и с ними нужно делать то же самое. Для каждого писать такой же “ручной” код, как выше - это очень неправильно и затратно по времени.
  • Вопрос задан
  • 1521 просмотр
Решения вопроса 1
list1 = ['one', 'two', 'three', 'six']
list2 = []
list3 = []
contain_flag = False

for item1 in list1:
    for item2 in list2:
        contain_flag = False
        
        if (item1 == item2):
            contain_flag = True
            break
        
    list3.append(contain_flag)

print (list3)

В list3 лежат бул-ы отвечающие на вопрос, содержится ли каждый элемент list1 в list2.
Элементы списка можете считать отдельными переменными и хэндлить дальше как угодно..
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
@anerev
Так можно получать пересечения списков:
list(set(list1) & set(list2))
Ответ написан
Комментировать
@Drill
Можно использовать словарь.

import string

list1 = [1, 2, 3, 6]
list2 = [1, 2, 4]

pairs = zip(string.ascii_uppercase, list1)
var = {k if v in list2 else k+'1': v for k,v in pairs}

print(var)
print(var['A'], var['B'], var['C1'], sep="\n")
print(f"{var['A']=}\n{var['B']=}\n{var['C1']=}")

In [4]: 
{'A': 1, 'B': 2, 'C1': 3, 'D1': 6}
1
2
3
var['A']=1
var['B']=2
var['C1']=3
Ответ написан
@pstbin Автор вопроса
Спасибо за ответы...
Может я как-то не так спрашиваю... Но это не те ответы, которые я хочу.
Я привету вам весь код, с моим, абсолютно деревянным решением, которое делает то, что я хочу, но это "такой себе" вариант решения, но может вам станет понятнее, что мне нужно.
import subprocess

#list1 = ['1', '2', '4', '5']
list2 = subprocess.getoutput("echo '1\n2\n4'")
for i in list2:
	if '1' in x:
		a = 'one'
	else:
		a = 'not in list'		
	if '2' in x:
		b = 'two'
	else:
		b = 'not in list'		
	if '3' in x:
		c = 'three'
	else:		
		c = 'not in list'
print(a, b, c, sep="\n")

В данном примере, первый список вообще не используется, именно потому, что я не знаю как, но очень хотел бы...
Ответ написан
@o5a
list1 = ['one', 'two', 'three', 'six']
list2 = ['one', 'two', 'four']
# общие элементы
print(set(list1) & set(list2))
# то, чего нет во 2-м списке
print(set(list1) - set(list2))
# то, чего нет во 1-м списке
print(set(list2) - set(list1))
Ответ написан
Комментировать
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
Вообще, так себе идея, конечно, у топик-стартера делать переменные динамически. Автор вопроса не знает наперёд сколько будет переменных, а значит вносит в программу неопределённость. Не понятно же есть та или иная переменная в конце-концов.

Конечно за счет интроспекции и наделать переменных, и проверить их наличие можно безопасно, но это делает код плохо читаемым, провоцирует на трудно уловимые ошибки.

Если автор вопроса настаивает, то может взять решение Drill и вынести содержимое словаря в локальный контекст:
locals().update(var)
locals().update(abc=123)  # создаст в локальном пространстве имён переменную `abc` со значением 123

Но это плохо. Плохо делать такие вот переменные динамически.
Опишите вашу задачу подробнее и конкретнее в этом или другом вопросе вам подскажут как правильнее решать такого рода задачи.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы