Как можно удалить из дерева возможных ходов цепочку [48, 56, 32, 10, 8, 1]?
<pre><code class="python"># в словаре x в ключе цепочка ходов в значении оценка
x = {
(48, 56, 32, 10, 8, 1): -6,
(48, 56, 32, 10, 1, 8): -12,
(48, 56, 10, 32, 8, 1, 'пропуск'): -18,
(48, 56, 10, 1, 32, 'пропуск', 8): 6,
(48, 56, 10, 1, 8, 32): -12
}
#строим дерево
дерево = {}
for moves, value in x.items():
узлы = дерево
for move in moves[0:-1]:
if move not in узлы:
узлы[move] = {}
узлы = узлы[move]
узлы[moves[-1]] = value
#Получилось вот такое вот дерево
{48: {56: {32: {10: {8: {'value': -6}, 1: {'value': -12}}}, 10: {32: {8: {1: {'value': -18}}}, 1: {32: {'пропуск': {'value': 6}}, 8: {'value': -12}}}}}}</code></pre>
Чтобы удалить заданную последовательность ходов из дерева, можно использовать рекурсивную функцию, которая будет проходить по дереву в поисках нужной цепочки. Если последовательность найдена, она будет удалена.
Вот пример реализации такого подхода:
```python
# Исходные данные
x = {
(48, 56, 32, 10, 8, 1): -6,
(48, 56, 32, 10, 1, 8): -12,
(48, 56, 10, 32, 8, 1, 'пропуск'): -18,
(48, 56, 10, 1, 32, 'пропуск', 8): 6,
(48, 56, 10, 1, 8, 32): -12
}
# строим дерево
дерево = {}
for moves, value in x.items():
узлы = дерево
for move in moves[0:-1]:
if move not in узлы:
узлы[move] = {}
узлы = узлы[move]
узлы[moves[-1]] = value
# Функция для удаления последовательности из дерева
def удалить_цепочку(дерево, цепочка):
if not цепочка:
return False
текущий = цепочка[0]
if текущий in дерево:
# Если это последний элемент в цепочке
if len(цепочка) == 1:
del дерево[текущий] # Удаляем узел
return True
else:
# Рекурсивно идем дальше по дереву
if удалить_цепочку(дерево[текущий], цепочка[1:]):
# Если ветка пустая после удаления, также удаляем этот узел
if not дерево[текущий]:
del дерево[текущий]
return True
return False
# Задаем последовательность, которую нужно удалить
цепочка_для_удаления = [48, 56, 32, 10, 8, 1]
# Удаляем последовательность
удалить_цепочку(дерево, цепочка_для_удаления)
# Проверяем результат
print(дерево)
```
Эта функция `удалить_цепочку` проходит по дереву в соответствии с последовательностью шагов. Если находит соответствие, пытается удалить узел. Если удаление делает узел пустым, оно удаляет родительский узел, если все его подузлы также не существуют.
Таким образом мы можем удалить любую заданную последовательность из дерева возможных ходов.
Да, можно. <br/> <br/> Накидал примерный код: <br/> <br/> <pre><code class="python">delete_sequence = [48, 56, 32, 10, 8, 1][:-1]
# Проходим по элементам и удаляем необходимый
for element in delete_sequence:
tree_for_deletion = tree_for_deletion[element]
del tree_for_deletion['value']
# Снова проходим по элементам и проверяем остались ли пустые значения по ключу, если да, то удаляем и завершаем цикл
tree_for_deletion = tree
for element in delete_sequence:
if not tree_for_deletion[element]:
del tree_for_deletion[element]
break
tree_for_deletion = tree_for_deletion[element]
print(tree)</code></pre> <br/> <br/> Вывод: <br/> <pre><code class="python">{48: {56: {32: {10: {1: {'value': -12}}}, 10: {32: {8: {1: {'value': -18}}}, 1: {32: {'пропуск': {'value': 6}}, 8: {'value': -12}}}}}}</code></pre> <br/> <br/> Скорее всего можно оптимизировать код. <br/> Буду очень рад, если кто-нибудь поделиться как)