Iter,值,字典中的项目不起作用

发布于 2021-01-29 17:39:14

有这个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 …,但是那不起作用如何修改代码?

关注者
0
被浏览
51
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您正在使用Python 3;使用dict.items()代替。

    Python 2dict.iter*方法已在Python
    3中重命名,该方法dict.items()现在默认返回字典视图而不是列表。字典视图的可迭代性与dict.iteritems()Python
    2中的可迭代性相同。

    来自Python 3新增功能文档

    * 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()从该可迭代对象中获取下一个值。

    您还必须nextwhile循环中重命名变量。使用该功能替换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]}
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看