d = {'x': 1, 'y': 2, 'z': 3}
for key in d:
print(key, 'corresponds to', d[key])
Python如何认识到它只需要从字典中读取密钥?key是一个特殊的关键字,还是仅仅是一个变量?
d = {'x': 1, 'y': 2, 'z': 3}
for key in d:
print(key, 'corresponds to', d[key])
Python如何认识到它只需要从字典中读取密钥?key是一个特殊的关键字,还是仅仅是一个变量?
当前回答
key只是一个变量名。
for key in d:
将简单地遍历字典中的键,而不是键和值。要循环键和值,可以使用以下方法:
对于Python 3.x:
for key, value in d.items():
对于Python 2.x:
for key, value in d.iteritems():
为了测试自己,将单词key改为poop。
在Python3.x中,itertists()被替换为简单的items(),它返回一个由dict支持的类似集合的视图,就像itertists(),但更好。这在2.7中也可用作viewitems()。
操作items()将同时适用于2和3,但在2中,它将返回字典(键、值)对的列表,这不会反映items(()调用后对字典的更改。如果您想要3.x中的2.x行为,可以调用list(d.items())。
其他回答
使用for..遍历字典时。。在..中-语法,它总是在键上迭代(值可以使用dictionary[key]访问)。
要迭代键值对,请使用以下命令:
对于Python 2中dict.iteritems()中的k,v对于Python 3中dict.items()中的k,v
对于通过字典进行迭代,可以使用以下代码。
dictionary= {1:"a", 2:"b", 3:"c"}
#To iterate over the keys
for key in dictionary.keys():
print(key)
#To Iterate over the values
for value in dictionary.values():
print(value)
#To Iterate both the keys and values
for key, value in dictionary.items():
print(key,'\t', value)
关键不是一个特殊的词,而是字典实现了迭代器协议。你可以在你的类中这样做,例如,关于如何构建类迭代器,请参阅这个问题。
对于字典,它是在C级实现的。详细信息见PEP 234。特别是标题为“字典迭代器”的部分:
字典实现了一个tp_iter槽,该槽返回一个有效的迭代字典键的迭代器。[…]这个意味着我们可以写对于dict中的k:。。。这相当于,但比对于dict.keys()中的k:。。。只要对词典修改的限制(由循环或由另一个线程)不会被违反。向返回不同类型的迭代器显式:对于dict.iterkeys()中的键:。。。对于dict.itervalues()中的值:。。。对于键,dict.iteritems()中的值:。。。这意味着,for x in dict是x in的简写dict.iterkeys()。
在Python 3中,不再支持dict.iterkeys()、dict.itervalues()和dict.iteritems()。请改用dict.keys()、dict.values()和dict.items()。
使用“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)
但出于学术目的,这个问题的例子很好。
我有一个用例,我必须遍历dict以获得键、值对以及指示我所在位置的索引。我是这样做的:
d = {'x': 1, 'y': 2, 'z': 3}
for i, (key, value) in enumerate(d.items()):
print(i, key, value)
请注意,键、值周围的括号很重要,如果没有它们,您将得到ValueError“没有足够的值来解包”。