2015-03-15 2 views
-5

Я хочу, чтобы заменить элементы в рекурсивном вложенном списке следующим образом:Замена элемента в рекурсивном вложенном списке питоне

["not", ["or",["not",["or",["not",["or",["P",["not", "Q"]]],"R"]],["and","P,"R"]]] 

Я хочу, чтобы переместить «не» внутрь. Таким образом, в основном, «или« заменяется на »и«, »и« by »или«, »не« больше не должно быть в списке, кроме как с переменными, например [«not», «R»] в порядке но ["not", ["not", "P"]] должен быть просто P., пожалуйста, помогите мне. У меня большая часть кода готова, но я не могу заменить исходный массив, потому что я использую рекурсию, чтобы перейти к самому внутреннему элементу, и по мере того, как я двигаюсь наружу, я должен иметь возможность заменить самый неповторимый элемент на изменения, которые я не можем. Пожалуйста, помогите мне.

+2

Покажите нам код пожалуйста. –

+2

Ваш формат списка не имеет смысла. Элементы 'и' и 'or' должны иметь ровно два элемента для брака, элементы' not' должны иметь ровно один. В вашем списке есть «не» с двумя братьями и сестрами, а «или» - ни с чем. Вы также пропускаете двойную кавычку (похоже, после финальной «P»), но исправление этого не решит проблему с братом. – jedwards

ответ

0

Вы можете использовать функцию и цикл for для рекурсивной замены элементов.

mylist = ["not", ["or",["not",["or",["not",["or","P",["not", "Q"]]]],"R"]],["and","P","R"]] 

def check(lst, replace): 
    newlst = lst[:] 
    for index, item in enumerate(lst): 
     if type(item) is list: 
      lst[index] = check(lst[index], replace) 
     elif type(item) is str: 
      if lst[index] == replace: 
       del newlst[index] 
    return newlst 

А затем получить новый список:

>>> print(check(mylist, 'not')) 
[['or', [['or', [['or', 'P', ['Q']]]], 'R']], ['and', 'P', 'R']] 
Смежные вопросы