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

for key in d:
    print(key, 'corresponds to', d[key])

Python如何认识到它只需要从字典中读取密钥?key是一个特殊的关键字,还是仅仅是一个变量?


当前回答

Python中的字典是键值对的集合。每个键都连接到一个值,您可以使用键访问与该键关联的值。键的值可以是数字、字符串、列表,甚至是另一个字典。在这种情况下,将每个“键值对”威胁为表中的单独一行:d是具有两列的表。键是第一列,键[value]是第二列。for循环是遍历表的标准方法。

其他回答

key只是一个变量。

对于Python2.X:

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

x corresponds to 1
y corresponds to 2
z corresponds to 3

…或更好,

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

for the_key, the_value in d.iteritems():
    print the_key, 'corresponds to', the_value

对于Python3.X:

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

for the_key, the_value in d.items():
    print(the_key, 'corresponds to', the_value)

要迭代键,使用my_dict.keys()会更慢,但效果更好。如果您尝试这样做:

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

它会创建一个运行时错误,因为在程序运行时您正在更改密钥。如果您绝对希望减少时间,请以my_dict方式使用for键,但您已收到警告。

您可以在GitHub上检查CPython的dicttype的实现。这是实现dict迭代器的方法的签名:

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

CPython dictobject.c

使用“for”循环遍历字典d={“x”:1,“y”:2,“z”:3}对于d中的键:...Python如何认识到它只需要从词典key是Python中的一个特殊单词吗?或者它只是一个变量

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

字典是键到值的映射:

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

每当我们迭代它时,我们都会迭代键。变量名称键仅用于描述,并且非常适合于此目的。

这发生在列表理解中:

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

当我们将字典传递给列表(或任何其他集合类型对象)时会发生这种情况:

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

Python迭代的方式是,在需要的上下文中,它调用对象的__iter_方法(在本例中为字典),该方法返回迭代器(在本示例中为keyiterator对象):

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

我们不应该自己使用这些特殊方法,而是使用各自的内置函数来调用它iter:

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

迭代器有一个__next__方法,但我们用内置函数调用它,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循环、列表理解、生成器表达式或任何其他迭代上下文的原因。一旦迭代器引发StopIteration,它就会一直引发它——如果你想再次迭代,你需要一个新的迭代器。

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

返回到dicts

我们已经看到dict在许多上下文中迭代。我们所看到的是,每当我们遍历一个dict时,我们都会得到密钥。回到最初的示例:

d={“x”:1,“y”:2,“z”:3}对于d中的键:

如果我们更改变量名,我们仍然会得到密钥。让我们试试看:

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

如果我们想要迭代这些值,我们需要使用dicts的.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)

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

使用for..遍历字典时。。在..中-语法,它总是在键上迭代(值可以使用dictionary[key]访问)。

要迭代键值对,请使用以下命令:

对于Python 2中dict.iteritems()中的k,v对于Python 3中dict.items()中的k,v