python функция для уменьшения логических операторов и операндов в списке - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть следующий список.

op=[[3,4,5],'or',[5,6,7],'or',[8,9,10],'and',[9,10,11],'and',[10,11,12]]

В этом списке есть списки и операторы ('и', 'или'), которые необходимо уменьшить.

Все 'и' сначала нужно выполнить операции, в конце концов оставив только «или». Как следует: Список после

step 1: [[3,4,5],'or',[5,6,7],'or',[8,9,10],'and',[10,11]]
step 2: [[3,4,5],'or',[5,6,7],'or' ,[10]]
step 3: [[3,4,5],'or',[5,6,7,10]]
step 4: [[3,4,5,6,7,10]]

Любая помощь приветствуется.

Спасибо, Соня

Ответы [ 3 ]

0 голосов
/ 24 апреля 2020

Вот моя попытка!

Этот подход использует рекурсию. Оператор печати может использоваться для проверки каждого шага, если я понял проблему как задумано. Некоторыми недостатками этого кода являются два вызова pop (не элегантно) и double для l oop. Но, основываясь на моем понимании проблемы, она, похоже, делает свою работу.

def main(op):
  print(op)
  if len(op) > 1: 
     for i in range(0, len(op)): 
        if op[i] == "and":
             new_ele = set(op[i-1]).intersection(set(op[i+1]))
             op[i-1] = new_ele
             op.pop(i)
             op.pop(i)
             main(op)
     for i in range(0, len(op)): 
        if op[i] == "or":
            new_ele = set(op[i-1]).union(set(op[i+1]))
            op[i-1] = new_ele
            op.pop(i)
            op.pop(i)
            print(op)
            main(op)

main(op)
print(op)

Предложения приветствуются!

0 голосов
/ 27 апреля 2020

Я придумал, как это реализовать. Спасибо всем вам за усердную работу над этим. Просьба go через мое решение тоже, и дайте мне знать, если он кажется нормальным.

Алгоритм следующим образом: 1. Разделите весь список на 2. Один для операндов (list lovop) и другой для операторов (list op ).

2.  

    while 'and' in op:
            j = op.index(7)
            print("index", j)
            # print(lovop)
            fn(j, lovop)
            op.pop(j)
            print(lovop)

3.

def fn(ind,lsts):
    lsts[ind]=list(set(lsts[ind]) & set(lsts[ind+1]))
    lsts.pop(ind+1)
    return(lsts)

4.

filters = unionlist(lovop)

5.

def unionlist(lst):
    result=set()
    for i in lst:
        result=result | set(i)
    return(list(result))
0 голосов
/ 24 апреля 2020

Вам нужно сделать две функции, одну для «и» и одну для «или». Вот мое предложение для 'или':

def Or(iter1, iter2):
    set1 = set(iter1)
    set1.add(iter2)
    return list(set1)

Для 'и':

def And(iter1, iter2):
    lst1 = []
    for iterable in iter1:
        if iterable in iter2:
            lst1.append(iterable)
    return lst1

Тогда вам просто нужно иметь какую-то функцию, которая перебирает список и, если он находит 'и', он запускает функцию And для элемента перед ним и для элемента после него, то же самое для функции Or. Похоже, это ваша Python домашняя работа, поэтому остальное я оставлю вам.

...