Iter, values, item в словаре не работает

Наличие этого кода python

edges = [(0, [3]), (1, [0]), (2, [1, 6]), (3, [2]), (4, [2]), (5, [4]), (6, [5, 8]), (7, [9]), (8, [7]), (9, [6])]
graph = {0: [3], 1: [0], 2: [1, 6], 3: [2], 4: [2], 5: [4], 6: [5, 8], 7: [9], 8: [7], 9: [6]}
cycles = {}
while graph:
    current = graph.iteritems().next()
    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)


def traverse(tree, root):
    out = []
    for r in tree[root]:
        if r != root and r in tree:
            out += traverse(tree, r)
        else:
            out.append(r)
    return out

print ('->'.join([str(i) for i in traverse(cycles, 0)]))



Traceback (most recent call last):
  File "C:\Users\E\Desktop\c.py", line 20, in <module>
    current = graph.iteritems().next()
AttributeError: 'dict' object has no attribute 'iteritems'

Я также пробовал itervalues, iterkeys... но это не работает Как изменить код?

Ответ 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]}