@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")


Вы можете подумать, что раз меня устраивает этот вариант, то можно так и оставить и не морочить никому голову, но нет, мне бы хотелось, всё таки, сделать именно автоматическое сравнение двух списков, с последующей передачей состояния каждого компонента, потому как у меня есть и другие команды, которые получают другие списки и с ними нужно делать то же самое. Для каждого писать такой же “ручной” код, как выше - это очень неправильно и затратно по времени.
  • Вопрос задан
  • 1374 просмотра
Решения вопроса 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

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

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

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 03:52
1000 руб./за проект
19 апр. 2024, в 03:01
1000 руб./за проект
18 апр. 2024, в 21:56
2000 руб./за проект