Вы можете использовать рекурсию, чтобы решить эту проблему. То, что вы делаете, это рекурсивно проверяет, находится ли значение в list1 (начиная со значения в list0). Если вы найдете его, то вы можете рекурсивно проверить, находится ли значение в списке list2 с тем же индексом в списке list1. Если это не так, вы знаете, что это последнее значение.
list0 = ['1', '2z', 'etc']
list1 = ['1', '1a', '2b', '3c', "1", "1bb","2z", "2zz","1a",'2b',"100","100"]
list2 = ['1a', '2b', '3c', '4d', "1bb", "8", "2zz", "3z", "7a","100", "91","92" ]
def findPath(val):
path = {val}
for i in range(len(list1)):
if list1[i] == val:
morePath = findPath(list2[i])
for elem in morePath:
path.add(elem)
if list1[i] in path:
path.remove(list1[i])
return path
for i in list0:
print(findPath(i))
Следует отметить, что вам нужно удалить текущий проверяемый индекс, поскольку вы знаете, что это не конечный индекс. Это хорошо работает, если в списках нет циклов, например, EG 1 -> 1a -> 1a, что приведет к бесконечному l oop. Другая проблема может быть, если у вас длинная цепочка преобразований, которая может вызвать рекурсивное переполнение стека.
Вот еще одно решение, которое я считаю более правильным. Он использует Очередь, чтобы знать, какое будет следующее значение для проверки. Кроме того, он проверяет одно и то же значение только один раз, проверяя, есть ли оно в наборе.
В одном я не уверен, что это правильный путь для трансформации. Кажется, что list1 содержит «1bb», который, как вы сказали, является последним элементом. Это правильно, или вместо этого должно быть «8»?
from queue import Queue
list0 = ['1', '2z', 'etc']
list1 = ['1', '1a', '2b', '3c', "1", "1bb","2z", "2zz","1a",'2b',"100","100"]
list2 = ['1a', '2b', '3c', '4d', "1bb", "8", "2zz", "3z", "7a","100", "91","92" ]
checked = set()
checkQueue = Queue()
def findPath(val):
path = set()
checkQueue.put(val)
while checkQueue.qsize() > 0:
curVal = checkQueue.get()
if curVal in checked:
continue
checked.add(curVal)
path.add(curVal)
for i in range(len(list1)):
if list1[i] == curVal:
if list1[i] in path:
path.remove(curVal)
checkQueue.put(list2[i])
return path
for i in list0:
print(findPath(i))
То, что второе решение решает, это обе проблемы зацикливания (так что программа не обрабатывает sh), которая выдаст нет значений в l oop и рекурсивная проблема, так как он делает это итеративно.