Ответ 1
Вы используете Python 3; вместо этого используйте dict.items()
.
Методы Python 2 dict.iter*
были переименованы в Python 3, где dict.items()
теперь возвращает список словарей вместо списка по умолчанию. Словарные представления действуют как итерации таким же образом dict.iteritems()
do в Python 2.
Из Python 3 What New documentation:
dict
методыdict.keys()
,dict.items()
иdict.values()
возвращают "представления" вместо списков. Например, это больше не работает:k = d.keys(); k.sort()
. Вместо этого используйтеk = sorted(d)
(это также работает в Python 2.5 и так же эффективно).- Кроме того, методы
dict.iterkeys()
,dict.iteritems()
иdict.itervalues()
больше не поддерживаются.
Кроме того, метод .next()
был переименован в .__next__()
, но словарные представления не являются итераторами. Строка graph.iteritems().next()
должна быть переведена вместо:
current = next(iter(graph.items()))
который использует iter()
, чтобы преобразовать представление элементов в итерируемый и next()
, чтобы получить следующее значение из этого итерабельного.
Вам также придется переименовать переменную next
в цикле while
; используя эту замену встроенной функции next()
, которая вам нужна здесь. Вместо этого используйте next_
.
Следующая проблема заключается в том, что вы пытаетесь использовать current
в качестве ключа в cycles
, но current
является кортежем целого числа и списка целых чисел, делая все значение недопустимым. Я думаю, вы хотели получить только следующий ключ, и в этом случае next(iter(dict))
предоставит вам следующее:
while graph:
current = next(iter(graph))
cycle = [current]
cycles[current] = cycle
while current in graph:
next_ = graph[current][0]
del graph[current][0]
if len(graph[current]) == 0:
del graph[current]
current = next_
cycle.append(next_)
Затем выдается некоторый вывод:
>>> cycles
{0: [0, 3, 2, 1, 0], 2: [2, 6, 5, 4, 2], 6: [6, 8, 7, 9, 6]}