2.12.5 遍历

dict的键值对设计,让我们可以通过key快速精准地定位到对应的value。但是,有很多场景,我们还是需要遍历整个数据集。

比如,有如下所示一个字典对象。


players = {
    "001": {
        "name": "Harden",
        "id": "001",
        "position": "point guard"
    },
    "002": {
        "name": "Davis",
        "id": "002",
        "position": "center"
    },
    "003": {
        "name": "Leonard",
        "id": "003",
        "position": "forward"
    },
    "004": {
        "name": "Curry",
        "id": "004",
        "position": "point guard"
    }
}

用for和in,我们可以遍历字典。


for player in players:
    print(player)

执行结果如下:


001
002
003
004

从结果上来看,for/in遍历到的是字典的key的集合,从这个角度来看,以上代码中的“player”变量的命名是欠妥当的,会引起一些误解,应该用更合理的变量名来改进这段代码。


for player_id in players:
    print(player_id)

执行结果如下:


001
002
003
004

或者用dict的keys方法,来更明显地表明变量的意义。


for player_id in players.keys():
    print(player_id)

根据遍历中得到的key,我们可以得到value。


for player_id in players:
    print(player_id, ':', players[player_id]['name'])

执行结果如下:


001 : Harden
002 : Davis
003 : Leonard
004 : Curry

这种遍历方式很简单,但是在循环体中,我们需要根据key得到value,这会让代码的可读性受到一些损害。字典的items方法可以让遍历的代码看起来更直观一点。


for player_id, player in players.items():
    print(player_id, ':', player['name'])

执行结果如下:


001 : Harden
002 : Davis
003 : Leonard
004 : Curry

如果我们不在乎key,想更轻松地得到value,有没有更简洁的方法?

我们刚刚看过dict的keys方法,这个方法可以得到key的集合,因此应该有一个相应的values方法。


for player in players.values():
    print(player['id'])

在学习的过程中,如果能从keys方法主动去联想和尝试values方法,我们就可以更加快速地了解这门编程语言,这是程序员应该掌握的学习方法。