【问题标题】:Python dictionary iteration: d vs. d.viewkeys()Python 字典迭代:d 与 d.viewkeys()
【发布时间】:2018-08-15 01:46:50
【问题描述】:

阅读this post 关于字典迭代的“iter-”和“view-”方法之间的区别后,我仍然对运行for i in d: ...for i in d.viewkeys(): ... 之间的优缺点感到好奇。第一个 sn-p 只是第二个的简写吗?请帮助这个好奇和迂腐的蟒蛇爱好者:)

【问题讨论】:

  • 我删除了python-3.x 标签,因为我认为这是一个python2 问题?
  • 啊,是的,对不起。我忘了d.viewkeys 是python 3.x 的d.keys 的python 2.x 端口。

标签: python python-2.7 dictionary key


【解决方案1】:

从迭代的角度来看,没有区别,因为iter 方法为两者返回相同类型的迭代器。这是有道理的,因为viewkeys 返回一个视图

>>> d = {}
>>> iter(d.viewkeys())
<dictionary-keyiterator object at 0x102567cb0>
>>> iter(d)
<dictionary-keyiterator object at 0x102567d08>
>>>

唯一的区别是创建视图对象的固定时间开销很小。

.viewkeys 如果您想要类似集合的行为,则很有用,例如:

>>> d1 = {'a':1,'b':2}
>>> d2 = {'a':2, 'b':1, 'c':3}
>>> d1.viewkeys() | d2.viewkeys()
set(['a', 'c', 'b'])
>>>

如果要遍历字典的键,直接遍历字典即可。

【讨论】:

    【解决方案2】:

    时间安排:

    from timeit import timeit
    print timeit(lambda: {i:i for i in range(10)}.keys())
    print timeit(lambda: {i:i for i in range(10)}.iterkeys())
    print timeit(lambda: {i:i for i in range(10)}.viewkeys())
    print timeit(lambda: list({i:i for i in range(10)}))
    

    输出:

    0.890981912613
    0.622451066971
    0.619216918945
    1.39578795433
    

    获胜者是.viewkeys(),但结果与.iterkeys()相似,都不错。

    迭代时间:

    import time
    s=time.time()
    for i in d:
        pass
    e=time.time()
    print e-s
    s=time.time()
    for i in d.viewkeys():
        pass
    e=time.time()
    print e-s
    s=time.time()
    for i in d.iterkeys():
        pass
    e=time.time()
    print e-s
    s=time.time()
    for i in d.keys():
        pass
    e=time.time()
    print e-s
    

    输出:

    1.90734863281e-06
    2.86102294922e-06
    9.53674316406e-07
    3.09944152832e-06
    

    【讨论】:

    • 这并没有显示任何关于迭代的内容...这些时间主要由创建字典所需的时间决定...
    • @juanpa.arrivillaga 编辑我的
    • 这些时间并没有展示太多,字典太小了,你正在计时一个循环,它们可能再次被方法调用和由于计算机的其他进程而引起的噪音所支配.
    • @juanpa.arrivillaga 是的,你实际上是对的,我无法用更大的字典测试它,因为我在 python 3.6.0 上,我必须在教程点代码编辑器上测试它我尝试使用更大的字典,但教程点不允许它,因为它是一个要处理的大字典
    • 以后考虑repl.it
    【解决方案3】:

    考虑这个例子:

    data = {"a": "123", "b": "456"}
    
    for i in data:
        print i
    
    for i in data.viewkeys():
        print i
    
    print data.viewkeys()
    print data
    

    输出:

    a
    b
    a
    b
    dict_keys(['a', 'b'])
    {'a': '123', 'b': '456'}
    

    从循环的角度来看,

    • for i in d: ... 将遍历实际字典,例如:{'a': '123', 'b': '456'}
    • for i in d.viewkeys(): ... 将循环通过 list 的键,例如:['a', 'b']

    如果您需要字典中的键列表,viewkeys 方法将很有用

    【讨论】:

    • 不正确。 viewkeysdict 中返回一个类似于集合的view 键。
    • 仅供参考,这是一个dict,而dict 不能有重复的键。
    猜你喜欢
    • 2014-03-04
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 2021-07-24
    • 2018-04-06
    • 2015-12-28
    • 1970-01-01
    相关资源
    最近更新 更多