Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 16, 2016 22:23:36

Kurtz
Зарегистрирован: 2016-03-18
Сообщения: 35
Репутация: +  0  -
Профиль   Отправить e-mail  

Результат итерации через список имеет неправильный порядок/List iteration result is out of order

 >>> graph = [(1, 2), (2, 3), (3, 1)]
>>> path = []
>>> while len(graph) > 0:
...     for i in graph:
...         print('i: {}'.format(i))
...         path.append(i[0])
...         print('path: {}'.format(path))
...         graph.remove(i)
...         print('graph: {}'.format(graph))
i: (1, 2)
path: [1]
graph: [(2, 3), (3, 1)]
i: (3, 1)
path: [1, 3]
graph: [(2, 3)]
i: (2, 3)
path: [1, 3, 2]
graph: []

Код и результат выше. Проблема в четвертой строке вывода — вторая итерация идет не в том порядке: (3, 1) (третий элемент графа) вместо (2, 3) (второй элемент графа). В результате путь равен 1, 3, 2 вместо 1, 2, 3. Проблема решается через for i in sorted(graph), но почему так происходит изначально? В интернете пишут про несоблюдения порядка итерации в словарях, но там это логично. Почему такое происходит со списком?

P.S.
Парсер съедает квадратные скобки в тексте.

Отредактировано Kurtz (Авг. 16, 2016 22:40:32)

Офлайн

#2 Авг. 17, 2016 01:34:25

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

Результат итерации через список имеет неправильный порядок/List iteration result is out of order

Kurtz
Почему такое происходит со списком?
Ты из него удаляешь во время итерации по нему, поэтому i перескакивает. При удалении элемента в списке все элементы справа от него сдвигаются влево. А итерация идёт как бы по индексам элементов.

Можешь сделать
  
    for i in graph[:]:



Отредактировано py.user.next (Авг. 17, 2016 01:39:56)

Офлайн

#3 Авг. 17, 2016 10:35:46

Kurtz
Зарегистрирован: 2016-03-18
Сообщения: 35
Репутация: +  0  -
Профиль   Отправить e-mail  

Результат итерации через список имеет неправильный порядок/List iteration result is out of order

py.user.next
Понял, спасибо!

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version