Пошаговое удаление элементов из списка - PullRequest
0 голосов
/ 02 ноября 2019

Я хотел бы просмотреть список и убедиться, что он соответствует определенным критериям. Список выглядит следующим образом:

mylist = ["dog", "a", "b", "-b", "cat", "-cat", "-a", "-dog"]

Я хотел бы иметь возможность просматривать этот список, и каждый раз, когда встречается символ "-", этот элемент сравнивается с элементом перед ним. Если эти два элемента одинаковы (за исключением «-»), оба будут удалены, и процесс будет повторен. Таким образом, в конечном итоге все будет выглядеть так:

["dog", "a", "b", "-b", "cat", "-cat", "-a", "-dog"]
["dog", "a", "cat", "-cat", "-a", "-dog"]
["dog", "a", "-a", "-dog"]
["dog", "-dog"]
[]

Где [] - это продукт, который будет использоваться для продвижения вперед (поэтому другие материалы не нужно печатать или показывать, этотолько процесс, который я представляю Python для того, чтобы дойти до конца).

Если сравниваемый список не удовлетворяет критериям удаления в какой-то момент, операция может просто остановиться. Итак, для списка, который выглядел так:

newlist = ["dog", "a", "b", "-a", "-b", "-dog"]

Так как первый встреченный символ "-" будет связан с "a", но предшествующим элементом является "b"

Я пытался проработать это с помощью цикла for:

lt4 = []
lt5 = []
for i in mylist:
    for j in i+1:
        if [j] == [j-1]:
            temp = i[-j:j+1]
            lt4.append(temp)
    lt5.append(lt4)

Я понимаю, что это грубая попытка, и она, очевидно, не работает;В настоящее время я получаю ошибки типа для целых чисел с переменными для итераций в цикле. Любая помощь всегда очень ценится.

Ответы [ 3 ]

0 голосов
/ 02 ноября 2019

Проблема может быть решена с помощью стека или, по крайней мере, думая, что полученный список является стеком. (Попробуйте исследовать предмет ... твой друг)

mylist = ["dog", "a", "b", "-b", "cat", "-cat", "-a", "-dog"]
# mylist = ["dog", "a", "b", "-a", "-b", "-dog"]

result=[]
for v in mylist:
  if len(result)>0 and v=='-'+result[-1]:
    result.pop()
  else:
    result.append(v)

print(result)
0 голосов
/ 03 ноября 2019

принятый ответ не будет работать для списка, в котором значение, содержащее дефис, стоит перед значением, не содержащим дефис, например mylist = ['-a', 'a']

, скорее, я бы использовал что-то вроде ниже

mylist = ["dog", "a", "b", "-b", "cat", "-cat", "-a", "-dog", 'z','-y']
newList = mylist.copy()
for i in mylist:
    if "-" in i:
        if i.replace("-","",1) in mylist:
            newList.remove(i)
            newList.remove(i.replace("-","",1))
print(newList)
0 голосов
/ 02 ноября 2019

Я бы, наверное, выбрал рекурсивное решение здесь.

Бегите по списку и ищите любые дополнительные пары. Если вы найдете его, удалите его и рекурсивно вызовите, чтобы удалить все новые значения, которые могли появиться:

def remove_negatives(inputs):
    print(inputs)
    for i in range(0, len(inputs) - 1):
        prev = inputs[i]
        next = inputs[i + 1]
        if len(next) > 0 and next[0] == '-' and prev == next[1:]:
            return remove_negatives(inputs[:i] + inputs[i + 2:])
    return inputs


start_list = ["dog", "a", "b", "-b", "cat", "-cat", "-a", "-dog"]
end_list = remove_negatives(start_list)

печатает:

['dog', 'a', 'b', '-b', 'cat', '-cat', '-a', '-dog']
['dog', 'a', 'cat', '-cat', '-a', '-dog']
['dog', 'a', '-a', '-dog']
['dog', '-dog']
[]
...