Python 2 中 dict.items() 和 dict.iteritems() 有什么区别?

2024-12-25 08:51:00
admin
原创
118
摘要:问题描述:dict.items()和之间是否存在适用的区别dict.iteritems()?来自Python 文档:dict.items():返回字典中(键,值)对列表的副本。dict.iteritems():返回字典(键,值)对的迭代器。如果我运行下面的代码,每个代码似乎都返回对同一对象的引用。我是否遗漏了...

问题描述:

dict.items()和之间是否存在适用的区别dict.iteritems()

来自Python 文档:

dict.items():返回字典中(键,值)对列表的副本。

dict.iteritems():返回字典(键,值)对的迭代器。

如果我运行下面的代码,每个代码似乎都返回对同一对象的引用。我是否遗漏了任何细微的差别?

#!/usr/bin/python

d={1:'one',2:'two',3:'three'}
print 'd.items():'
for k,v in d.items():
   if d[k] is v: print '    they are the same object' 
   else: print '    they are different'

print 'd.iteritems():'   
for k,v in d.iteritems():
   if d[k] is v: print '    they are the same object' 
   else: print '    they are different'   

输出:

d.items():
    they are the same object
    they are the same object
    they are the same object
d.iteritems():
    they are the same object
    they are the same object
    they are the same object

解决方案 1:

这是进化的一部分。

最初,Pythonitems()会构建一个真正的元组列表并返回它。这可能会占用大量额外内存。

然后,将生成器引入到语言中,并将该方法重新实现为名为 的迭代器生成器方法iteritems()。原始方法保留下来以实现向后兼容。

Python 3 的一项变化是 items()现在返回视图,并且list永远不会完全构建。该iteritems()方法也消失了,因为items()在 Python 3 中它的工作方式与viewitems()在 Python 2.7 中一样。

解决方案 2:

dict.items()返回 2 元组的列表 ( [(key, value), (key, value), ...]),而dict.iteritems()是生成 2 元组的生成器。前者最初占用更多空间和时间,但访问每个元素的速度很快,而第二个最初占用较少空间和时间,但生成每个元素的时间稍长。

解决方案 3:

在 Py2.x 中

命令dict.items()和返回字典对、键和值列表副本dict.keys()。如果复制的列表非常大,这可能会占用大量内存。dict.values()`(k, v)`

命令dict.iteritems()dict.iterkeys()dict.itervalues()返回字典对、键和值的迭代器(k, v)

命令dict.viewitems()dict.viewkeys()dict.viewvalues()返回视图对象,这些对象可以反映字典的变化。 (即,如果您在字典中del添加一个项目或一对,则视图对象可以同时自动更改。)(k,v)

$ python2.7

>>> d = {'one':1, 'two':2}
>>> type(d.items())
<type 'list'>
>>> type(d.keys())
<type 'list'>
>>> 
>>> 
>>> type(d.iteritems())
<type 'dictionary-itemiterator'>
>>> type(d.iterkeys())
<type 'dictionary-keyiterator'>
>>> 
>>> 
>>> type(d.viewitems())
<type 'dict_items'>
>>> type(d.viewkeys())
<type 'dict_keys'>

在 Py3.x 中

在 Py3.x 中,事情变得更加清晰,因为只有dict.items()和可用,它们返回视图对象,dict.keys()就像在Py2.x 中一样。dict.values()`dict.viewitems()`

正如@lvc 指出的那样,视图对象与迭代器不同,因此如果您想在 Py3.x 中返回迭代器,则可以使用iter(dictview)

$ python3.3

>>> d = {'one':'1', 'two':'2'}
>>> type(d.items())
<class 'dict_items'>
>>>
>>> type(d.keys())
<class 'dict_keys'>
>>>
>>>
>>> ii = iter(d.items())
>>> type(ii)
<class 'dict_itemiterator'>
>>>
>>> ik = iter(d.keys())
>>> type(ik)
<class 'dict_keyiterator'>

解决方案 4:

你问:“dict.items() 和 dict.iteritems() 之间有什么适用的区别吗?”

这可能会有帮助(对于 Python 2.x):

>>> d={1:'one',2:'two',3:'three'}
>>> type(d.items())
<type 'list'>
>>> type(d.iteritems())
<type 'dictionary-itemiterator'>

您可以看到d.items()返回一个由键、值对组成的元组列表,并d.iteritems()返回一个字典项生成器。

作为列表,d.items() 是可切片的:

>>> l1=d.items()[0]
>>> l1
(1, 'one')   # an unordered value!

但没有__iter__方法:

>>> next(d.items())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list object is not an iterator

作为迭代器,d.iteritems()不可切片:

>>> i1=d.iteritems()[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'dictionary-itemiterator' object is not subscriptable

但确实有__iter__

>>> next(d.iteritems())
(1, 'one')               # an unordered value!

因此项目本身是相同的——运送项目的容器不同。一个是列表,另一个是迭代器(取决于 Python 版本...)

因此,dict.items() 和 dict.iteritems() 之间的适用差异与列表和迭代器之间的适用差异相同。

解决方案 5:

dict.items()返回元组列表,并dict.iteritems()返回字典中元组的迭代器对象为(key,value)。元组相同,但容器不同。

dict.items()基本上将所有字典复制到列表中。尝试使用以下代码比较和的执行时间dict.items()dict.iteritems()你会看到差异。

import timeit

d = {i:i*2 for i in xrange(10000000)}  
start = timeit.default_timer() #more memory intensive
for key,value in d.items():
    tmp = key + value #do something like print
t1 = timeit.default_timer() - start

start = timeit.default_timer()
for key,value in d.iteritems(): #less memory intensive
    tmp = key + value
t2 = timeit.default_timer() - start

我的机器上的输出:

Time with d.items(): 9.04773592949
Time with d.iteritems(): 2.17707300186

这清楚地表明dictionary.iteritems()效率更高。

解决方案 6:

dict.iteritems在 Python3.x 中已经消失,因此使用iter(dict.items())可以获得相同的输出和内存分配

解决方案 7:

如果你有

dict = {key1:value1, key2:value2, key3:value3,...}

Python 2中,dict.items()复制每个元组并返回字典中的元组列表,即[(key1,value1), (key2,value2), ...]。这意味着整个字典被复制到包含元组的新列表中

dict = {i: i * 2 for i in xrange(10000000)}  
# Slow and memory hungry.
for key, value in dict.items():
    print(key,":",value)

dict.iteritems()返回字典项迭代器。返回项的值也相同,即(key1,value1), (key2,value2), ...,但这不是列表。这只是字典项迭代器对象。这意味着更少的内存使用量(减少 50%)。

  • 列出可变快照:d.items() -> list(d.items())

  • 迭代器对象:d.iteritems() -> iter(d.items())

元组相同。您比较了每个元组,因此得到相同的结果。

dict = {i: i * 2 for i in xrange(10000000)}  
# More memory efficient.
for key, value in dict.iteritems():
    print(key,":",value)

Python 3中,dict.items()返回迭代器对象。dict.iteritems() 已被删除,因此不再存在问题。

解决方案 8:

dict.iteritems():为您提供一个迭代器。您可以在循环之外的其他模式中使用该迭代器。

student = {"name": "Daniel", "student_id": 2222}

for key,value in student.items():
    print(key,value)

('student_id', 2222)
('name', 'Daniel')

for key,value in student.iteritems():
    print(key,value)

('student_id', 2222)
('name', 'Daniel')

studentIterator = student.iteritems()

print(studentIterator.next())
('student_id', 2222)

print(studentIterator.next())
('name', 'Daniel')

解决方案 9:

python 2 中的 dict.iteritems() 相当于 python 3 中的 dict.items()。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用