Найти - Пользователи
Полная версия: Работа со списками
Начало » Python для новичков » Работа со списками
1 2
pstbin
Добрый день.

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

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

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

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

Python 3.8

Windows 10.
FishHook
pstbin
Подскажите пожалуйста, как это организовать.
организовать это лучше работая не со списками, а с множествами
pstbin
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’) (только в квадратных скобках, не знаю как они тут рисуются)но это не то…
FishHook
pstbin
Да я и не против, мне бы пример, как это правильно сделать.
какой пример вам нужен? Я дал вам всю необходимую информацию.
Открыть гугл, вбить в поик “множества в питоне” - это для вас чересчур сложно?
Учебник читать вы тоже не пробовали?
pstbin
FishHook
какой пример вам нужен? Я дал вам всю необходимую информацию.
Открыть гугл, вбить в поик “множества в питоне” - это для вас чересчур сложно?
Учебник читать вы тоже не пробовали?
Спасибо.
Как-то я сам не допёр, что есть ещё книжки.
Ушёл читать…
py.user.next
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)]
>>>
pstbin
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")

Да, забыл добавить, вы можете подумать, что раз меня устраивает этот вариант, то можно так и оставить и не морочить никому голову, но нет, мне бы хотелось, всё таки, сделать именно автоматическое сравнение двух списков, с последующей передачей состояния каждого компонента, потому как у меня есть и другие команды, которые получают другие списки и с ними нужно делать то же самое. Для каждого писать такой же “ручной” код, как выше - это очень неправильно и затратно по времени.
Rafik
Не заморачивайтесь со списками, используйте множества: вместо идеального списка - множество с идеальными значениями. Полученный второй список преобразовать в множество и получить разность множеств. Из полученного множества можно извлечь элементы в цикле и присваивать/передавать их в том же цикле кому и чему угодно.
Почитайте операции над множествами
Обратите внимание на влияние порядка расположения операндов на результат!
pstbin
Rafik
Не заморачивайтесь со списками, используйте множества
Спасибо, попробую…
py.user.next
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!
>>>
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB