Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 9, 2020 15:49:59

pstbin
Зарегистрирован: 2020-01-09
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа со списками

Добрый день.

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

Есть у меня два списка, список 2 («list2»), может быть совсем пустым:

  
list1 = [one, two, three, six]
list2 = [one, two, four]

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

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

Python 3.8

Windows 10.

Отредактировано FishHook (Янв. 9, 2020 16:04:32)

Офлайн

#2 Янв. 9, 2020 16:05:56

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Работа со списками

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



Офлайн

#3 Янв. 9, 2020 16:24:46

pstbin
Зарегистрирован: 2020-01-09
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа со списками

FishHook
организовать это лучше работая не со списками, а с множествами
Да я и не против, мне бы пример, как это правильно сделать.
Сами списки я сравнить могу и даже результат получаю, но это не то, что мне нужно, потому как я получаю новый список, а мне нужно загонять каждый результат сравнения в новую переменную.
вот код:
 list1 = ['1', '2', '4', '5']
 list2 = ['1', '2', '3']
 list1 = [i for i in list1 if not i in list2]
 print(list1)
На выходе я получаю ('4', ‘5’) (только в квадратных скобках, не знаю как они тут рисуются)но это не то…

Отредактировано pstbin (Янв. 9, 2020 16:27:56)

Офлайн

#4 Янв. 9, 2020 17:08:57

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Работа со списками

pstbin
Да я и не против, мне бы пример, как это правильно сделать.
какой пример вам нужен? Я дал вам всю необходимую информацию.
Открыть гугл, вбить в поик “множества в питоне” - это для вас чересчур сложно?
Учебник читать вы тоже не пробовали?



Офлайн

#5 Янв. 9, 2020 17:35:40

pstbin
Зарегистрирован: 2020-01-09
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа со списками

FishHook
какой пример вам нужен? Я дал вам всю необходимую информацию.
Открыть гугл, вбить в поик “множества в питоне” - это для вас чересчур сложно?
Учебник читать вы тоже не пробовали?
Спасибо.
Как-то я сам не допёр, что есть ещё книжки.
Ушёл читать…

Офлайн

#6 Янв. 10, 2020 03:19:39

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10031
Репутация: +  857  -
Профиль   Отправить e-mail  

Работа со списками

pstbin
Может я не правильно спрашиваю, потому пишу вам.
Задача выглядит странно.

pstbin
то я хочу этот элемент поместить в переменную «А», а если же нет такого элемента, то поместить искомый элемент в переменную «А1»
А зачем тебе это нужно?

Скорее всего, то, что ты делаешь, нужно делать по-другому, поэтому и подход должен быть другой. Может быт, нужны множества, а может и вообще другое что-нибудь.

Разбить элементы первого списка по принадлежности ко второму списку можно так
  
>>> lst1 = [1, 2, 3, 4, 5]
>>> lst2 = [2, 4]
>>> 
>>> out = [(i, i in lst2) for i in lst1]
>>> out
[(1, False), (2, True), (3, False), (4, True), (5, False)]
>>>



Офлайн

#7 Янв. 10, 2020 10:09:27

pstbin
Зарегистрирован: 2020-01-09
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа со списками

py.user.next
Задача выглядит странно.
Да, наверное, но я попытаюсь её объяснить более подробно.
py.user.next
А зачем тебе это нужно?
Это нужно для мониторинга.
У меня есть определённая команда, которая выполняется на определённом сервере (все подробности приведу в коде ниже), команда эта получает список подключенных компонентов к серверу. Выглядит это так: “
компонент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")

Да, забыл добавить, вы можете подумать, что раз меня устраивает этот вариант, то можно так и оставить и не морочить никому голову, но нет, мне бы хотелось, всё таки, сделать именно автоматическое сравнение двух списков, с последующей передачей состояния каждого компонента, потому как у меня есть и другие команды, которые получают другие списки и с ними нужно делать то же самое. Для каждого писать такой же “ручной” код, как выше - это очень неправильно и затратно по времени.

Отредактировано pstbin (Янв. 10, 2020 10:20:02)

Офлайн

#8 Янв. 10, 2020 11:48:19

Rafik
Зарегистрирован: 2018-09-04
Сообщения: 231
Репутация: +  27  -
Профиль   Отправить e-mail  

Работа со списками

Не заморачивайтесь со списками, используйте множества: вместо идеального списка - множество с идеальными значениями. Полученный второй список преобразовать в множество и получить разность множеств. Из полученного множества можно извлечь элементы в цикле и присваивать/передавать их в том же цикле кому и чему угодно.
Почитайте операции над множествами
Обратите внимание на влияние порядка расположения операндов на результат!

Отредактировано Rafik (Янв. 10, 2020 11:49:21)

Офлайн

#9 Янв. 10, 2020 11:54:03

pstbin
Зарегистрирован: 2020-01-09
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа со списками

Rafik
Не заморачивайтесь со списками, используйте множества
Спасибо, попробую…

Офлайн

#10 Янв. 10, 2020 13:39:50

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10031
Репутация: +  857  -
Профиль   Отправить e-mail  

Работа со списками

pstbin
но этот вариант очень плохой
Да.

Надо использовать питон только и из него использовать модуль socket для получения данных от сервера.
python.org. socket. пример клиента

Потом полученные данные можно обработать через модуль питона re, чтобы выделить компоненты из них.
python.org. re

И потом уже из выделенных данных нужно составить словарь dict(), в котором имена компонент отображаются на строковые значения этих компонент либо на None'ы.

Дальше этот словарь используется внутри программы для того, чтобы функции по нему работали. По нему они могут действовать; по нему они могут проверить, правильный ли ответ от сервера; по нему они могут составить новый словарь для отображения в какой-то системе; также по нему они могут составить json-данные для передачи наружу.

Знаешь, как функции в питоне делать?

pstbin
Да, забыл добавить, вы можете подумать, что раз меня устраивает этот вариант, то можно так и оставить и не морочить никому голову, но нет, мне бы хотелось, всё таки, сделать именно автоматическое сравнение двух списков, с последующей передачей состояния каждого компонента, потому как у меня есть и другие команды, которые получают другие списки и с ними нужно делать то же самое. Для каждого писать такой же “ручной” код, как выше - это очень неправильно и затратно по времени.
Это правда. Но тут надо использовать не просто такие мелочи, а применить структурное программирование. А для этого надо использовать функции.

Пример функций
  
>>> def f(a, b):
...     return a + b
... 
>>> def g(a, b):
...     return (f(a, b) + f(a, b)) * f(a, b)
... 
>>> def h(value):
...     return 'The value is equal to {}!'.format(value)
... 
>>> print(h(g(3, 5) + g(3, 5)))
The value is equal to 256!
>>>



Отредактировано py.user.next (Янв. 10, 2020 13:41:25)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version