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

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

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


当前回答

对于通过字典进行迭代,可以使用以下代码。

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)

其他回答

这是一个非常常见的循环习惯用法。in是运算符。有关何时在dict中使用key以及何时必须在dict.keys()中使用key的信息,请参阅David Goodger的惯用Python文章(存档副本)。

如果您正在寻找清晰直观的示例:

cat  = {'name': 'Snowy', 'color': 'White' ,'age': 14}
for key , value in cat.items():
   print(key, ': ', value)

结果:

name:  Snowy
color:  White
age:  14

对dict进行迭代时,不按特定顺序遍历其键,如您所见:

(Python 3.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)]

这将提供元组列表。当您这样循环它们时,每个元组都会自动解压缩为k和v:

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

如果循环体只有几行,则在遍历dict时使用k和v作为变量名是非常常见的。对于更复杂的循环,最好使用更具描述性的名称:

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

养成使用格式字符串的习惯是个好主意:

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

这将按升序值按排序顺序打印输出。

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

def by_value(item):
    return item[1]

for key, value in sorted(d.items(), key=by_value):
    print(key, '->', value)

输出:

y->1z->2x->3

使用“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)

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