使用“for”循环遍历字典

我有点困惑下面的代码:

d = {'x': 1, 'y': 2, 'z': 3} for key in d: print key, 'corresponds to', d[key] 

我不明白的是key部分。 Python如何识别它只需要从字典中读取密钥? 在Python中, key是一个特殊的词吗? 或者它只是一个variables?

key只是一个variables名称。

 for key in d: 

将简单地遍历字典中的键,而不是键和值。 要循环键和值,可以使用以下命令:

对于Python 2.x:

 for key, value in d.iteritems(): 

对于Python 3.x:

 for key, value in d.items(): 

要自己testing,请将字改为poop

对于Python 3.x, iteritems()已经被简单的items()所替代,它返回一个类似于dict的视图,比如iteritems()但是更好。 在2.7中也可以使用viewitems()

操作items()将适用于2和3,但在2它将返回字典(key, value)对的列表,这不会反映在调用items()之后发生的字典的更改。 如果你想要3.x中的2.x行为,你可以调用list(d.items())

这不是关键词,而是词典实现迭代器协议。 你可以在你的类中做到这一点,例如看到这个问题如何构build类迭代器。

在字典的情况下,它在C级执行。 详情请参阅PEP 234 。 特别是标题为“词典迭代器”一节:

  • 字典实现了一个tp_iter槽,它返回一个有效的迭代器,迭代器遍历字典的键。 这意味着我们可以写

     for k in dict: ... 

    这相当于,但要快得多

     for k in dict.keys(): ... 

    只要不违反字典修改限制(循环或其他线程)。

  • 将方法添加到显式返回不同types迭代器的字典中:

     for key in dict.iterkeys(): ... for value in dict.itervalues(): ... for key, value in dict.iteritems(): ... 

    这意味着for x in dictfor x in dict.iterkeys()

迭代一个dict迭代通过它的键没有特定的顺序,你可以在这里看到:

编辑:(这不再是在Python3.6的情况下 ,但请注意,它不是保证行为呢)

 >>> d = {'x': 1, 'y': 2, 'z': 3} >>> list(d) ['y', 'x', 'z'] >>> d.keys() ['y', 'x', 'z'] 

对于你的例子,使用dict.items()是一个更好的主意:

 >>> d.items() [('y', 2), ('x', 1), ('z', 3)] 

这给你一个元组列表。 当你像这样循环它们时,每个元组都会自动解压缩为kv

 for k,v in d.items(): print(k, 'corresponds to', v) 

如果循环的主体只有几行,在循环dict时使用kv作为variables名是相当普遍的。 对于更复杂的循环,使用更多的描述性名称可能是一个好主意:

 for letter, number in d.items(): print(letter, 'corresponds to', number) 

养成使用格式string的习惯是个好主意:

 for letter, number in d.items(): print('{0} corresponds to {1}'.format(letter, number)) 

使用for .. in .. -syntax遍历字典时,它总是遍历键(可通过dictionary[key]访问这些值)。

要遍历键值对,请使用for k,v in s.iteritems()

key只是一个variables。

你可以这样做:

 d = {'x': 1, 'y': 2, 'z': 3} for my_var in d: print my_var, 'corresponds to', d[my_var] 

…或更好,

 d = {'x': 1, 'y': 2, 'z': 3} for the_key, the_value in d.iteritems(): print the_key, 'corresponds to', the_value 

这是一个非常普遍的循环成语。 是一个操作员。 关于何时使用for key in dict和何时必须for key in dict.keys()请参阅David Goodger的习语Python文章 。

你可以使用这个:

 for key,val in d.items(): print key, 'is the key for ', val 

我有一个用例,我必须遍历字典来获得键,值对,也是索引指示我在哪里。 这是我如何做到的:

 d = {'x': 1, 'y': 2, 'z': 3} for i, (key, value) in enumerate(d.items()): print(i, key, value) 

请注意,关键字周围的圆括号非常重要,如果没有括号,则会出现ValueError“没有足够的值来解包”。

使用“for”循环遍历字典

 d = {'x': 1, 'y': 2, 'z': 3} for key in d: ... 

Python如何识别它只需要从字典中读取密钥? 在Python中,关键是一个特殊的词吗? 或者它只是一个variables?

这不仅仅是循环。 这里重要的词是“迭代”。

字典是键与值的映射:

 d = {'x': 1, 'y': 2, 'z': 3} 

任何时候我们遍历它,我们遍历键。 variables名称的key只是描述性的,而且对于这个目的来说非常适合。

这发生在列表理解中:

 >>> [k for k in d] ['x', 'y', 'z'] 

它发生在我们将字典传递给列表(或任何其他集合types对象)时:

 >>> list(d) ['x', 'y', 'z'] 

Python迭代的方式是在需要的上下文中调用对象的__iter__方法(在这个例子中是字典),它返回一个迭代器(在本例中是一个keyiterator对象):

 >>> d.__iter__() <dict_keyiterator object at 0x7fb1747bee08> 

我们不应该使用这些特殊的方法,而应该使用相应的内build函数来调用它,

 >>> key_iterator = iter(d) >>> key_iterator <dict_keyiterator object at 0x7fb172fa9188> 

迭代器有一个__next__方法 – 但是我们用内build函数调用它, next

 >>> next(key_iterator) 'x' >>> next(key_iterator) 'y' >>> next(key_iterator) 'z' >>> next(key_iterator) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration 

迭代器耗尽时,会引发StopIteration 。 这就是Python知道如何退出for循环,列表理解,或生成器expression式,或任何其他迭代上下文。 一旦一个迭代器引发StopIteration它会一直提高它 – 如果你想再次迭代,你需要一个新的。

 >>> list(key_iterator) [] >>> new_key_iterator = iter(d) >>> list(new_key_iterator) ['x', 'y', 'z'] 

回到说话

我们已经看到在许多情况下迭代的字典。 我们所看到的是,只要我们重复一遍字典,我们就能得到钥匙。 回到原来的例子:

 d = {'x': 1, 'y': 2, 'z': 3} for key in d: 

如果我们改变variables的名字,我们仍然得到钥匙。 让我们试试看:

 >>> for each_key in d: ... print(each_key, '=>', d[each_key]) ... x => 1 y => 2 z => 3 

如果我们想迭代这些值,我们需要使用字典的.values方法,或者同时使用两个.items

 >>> list(d.values()) [1, 2, 3] >>> list(d.items()) [('x', 1), ('y', 2), ('z', 3)] 

在给出的例子中,迭代这样的项目会更有效率:

 for a_key, corresponding_value in d.items(): print(a_key, corresponding_value) 

但是出于学术目的,这个问题的例子就好了。

要遍历密钥,使用my_dict.keys()会更慢但更好。 如果你试图做这样的事情:

 for key in my_dict: my_dict[key+"-1"] = my_dict[key]-1 

它会创build一个运行时错误,因为您在程序运行时更改了键。 如果你完全设定了减less时间,使用for key in my_dict方式的for key in my_dict ,但是你已经被警告;)。

Python 2

字典是如此重要的tpo Python也很容易使用。 要遍历字典中的每个键,只需使用“for d in d”或“for key in d”或任何variables来代替k或key,如同我的例子。 这是因为默认情况下,您可以像这样迭代字典的键。 通过你在循环中用来迭代密钥的variables来访问你的键值d [k]或者d [key]或者d [nameofvariable]。

 d = {'x': 1, 'y': 2, 'z': 3} for key in d: print key, 'corresponds to', d[key] 

Python 3.6

你也可以做这样的事情:

 d = {'x': 1, 'y': 2, 'z': 3} for k,v in d.items(): print(k,":",v) 

产量

 x : 1 y : 2 z : 3 

你可以在github上检查cpython dicttype的实现。 这是实现字典迭代器的方法的签名:

 _PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue, Py_hash_t *phash) 

cpython dictobject.c