Как завершить While-L oop, когда значение встречается внутри вложенного списка в Python? - PullRequest
2 голосов
/ 20 июня 2020

У меня есть вложенный список, и я пытаюсь завершить while-l oop, когда значение внутри вложенного l oop ищется через For-L oop. Моя проблема в том, что он зацикливается вечно.

listA = [
['a','b'], # 0, -5
['b','c'], # 1, -4
['c','d'], # 2, -3
['a','d'], # 3, -2
['b','e'], # 4, -1
]

endpoint = 'c'
point = ''
while point is not endpoint:
    for sets in listA:
        for point in sets:
            print(point)

Я хочу, чтобы результат был таким:

a
b
b
c

Ответы [ 2 ]

4 голосов
/ 20 июня 2020

можно сделать: -

listA = [
['a','b'], # 0, -5
['b','c'], # 1, -4
['c','d'], # 2, -3
['a','d'], # 3, -2
['b','e'], # 4, -1
]

endpoint = 'c'
done = False
for sets in listA:
    if done:
        break
    for point in sets:
        print(point)
        if point == endpoint:
            done=True
            break
1 голос
/ 20 июня 2020
Ответ

Ya sh выполняет свою работу.

Другой способ сделать это - определить функцию и вернуть ее, когда точка равна конечной точке.

listA = [
['a','b'], # 0, -5
['b','c'], # 1, -4
['c','d'], # 2, -3
['a','d'], # 3, -2
['b','e'], # 4, -1
]

endpoint = 'c'

def foo(items, endpoint):
    for sets in items:
        for point in sets:
            print(point)
            if point == endpoint:
                return

foo(listA, endpoint)

Но чтобы ответить на ваш вопрос, почему это не работает, это потому, что второе for l oop всегда будет выполняться полностью, а значение точки будет всегда будет последним значением последнего набора в список (в данном случае 'e'). Вот почему while l oop будет работать вечно, поскольку он всегда будет проверять, не является ли 'e' не 'c', оценивающимся как истина.

Если вы хотите сохранить свое старое решение, вы можете сделать это:

listA = [
['a','b'], # 0, -5
['b','c'], # 1, -4
['c','d'], # 2, -3
['a','d'], # 3, -2
['b','e'], # 4, -1
]

endpoint = 'c'
point = ''
while point != endpoint:
    for sets in listA:
        for point in sets:
            print(point)
            if endpoint == point:
                break
        else: 
            continue
        break

Это в основном торможение из вложенных for циклов, когда point равно endpoint.

Как видите, вы проверяете, являются ли точка и конечная точка то же самое дважды (в if endpoint == point и в while l oop), поэтому while l oop не требуется.

...