在Python中,字典是一系列键值对。每个键都与一个值相关联,可以使用键来访问相关联的值。与键相关联的值可以是数、字符串、列表乃至字典。事实上,可将任何Python对象用作字典中的值。
在Python中,字典用放在花括号( { } )中的一系列键值对表示。
键值对是两个相关联的值。指定键时,Python将返回与之相关联的值。键和值之间用冒号分隔,而键值对之间用逗号分隔。在字典中,想存储多少个键值对都可以。
alien_0 = {} #定义空的字典 print(alien_0) favorite_languages = { 'jen': 'Python', 'sarah': 'c', 'edward': 'ruby', 'phil': 'Python', } #添加了缩进使得与键值对对齐 print(favorite_languages) 输出: {} {'jen': 'Python', 'sarah': 'c', 'edward': 'ruby', 'phil': 'Python'}
要获取与键相关的值,可依次指定字典名和放在括号内的值。
alien_0 = {'color':'green', 'points':5} print(alien_0) alien_0['color'] = 'red' print(alien_0) 输出: {'color': 'green', 'points': 5} {'color': 'red', 'points': 5}
alien_0 = {'color':'green', 'points':5} print(alien_0) alien_0['x_position'] = 0 alien_0['y_position'] = 1 print(alien_0) 输出: {'color': 'green', 'points': 5} {'color': 'green', 'points': 5, 'x_position': 0, 'y_position': 1}
alien_0 = {'color':'green', 'points':5} print(alien_0) del alien_0['color'] print(alien_0) 输出: {'color': 'green', 'points': 5} {'points': 5}
favorite_languages = { 'jen': 'Python', 'sarah': 'c', 'edward': 'ruby', 'phil': 'Python', } #寻找存在的键值对 sarah = favorite_languages.get('sarah',"No such a student!") print(sarah) #寻找不存在的键值对 Malong = favorite_languages.get('Malong',"No such a student!") print(Malong) 输出: c No such a student!
语法: dictionary = {} #遍历键值对 for k,v in dictionary.items() #遍历键 for k in dictionary.keys() for k in dictionary #直接遍历字典的时候,默认遍历key #遍历值 for v in dictionary.values() for v in set(dictionary.values)
其中,items()返回一个可迭代的键值对列表对象,keys()返回一个可迭代的键列表对象,values()返回一个可迭代的值列表对象。值得一提的是:
#集合 union = {'first','second','third','first'} print(union) for item in union: print(item) 输出: {'second', 'third', 'first'} second third first
下面展示如何从迭代器中取出元素并生成列表:
dictionary = { 'jen': 'Python', 'sarah': 'c', 'edward': 'ruby', 'phil': 'Python', } #得到一个可迭代列表对象,每个元素都是一个元组 items_1 = dictionary.items() print(items_1) #从中获取元素列表的唯一方法,用for循环迭代取出 items = [item for item in dictionary.items()] print(items) #获得列表之后可以对列表进行操作 del items[0] print(items) #可以从列表中取出元组 new_tuple = items[0] print(new_tuple) #同样可以对取出元组进行操作 new_tuple = (1,2) print(new_tuple) 输出: [('jen', 'Python'), ('sarah', 'c'), ('edward', 'ruby'), ('phil', 'Python')] [('sarah', 'c'), ('edward', 'ruby'), ('phil', 'Python')] ('sarah', 'c') (1, 2)
下面展示keys()和values():
dictionary = { 'jen': 'Python', 'sarah': 'c', 'edward': 'ruby', 'phil': 'Python', } #不使用keys()的默认情况 first_keys = [key for key in dictionary] print(first_keys) #使用keys()取得键 second_keys = [key for key in dictionary.keys()] print(second_keys) #直接使用values()可能会得到重复的值 repeat_values = [value for value in dictionary.values()] print(repeat_values) #使用set()可以对得到的值列表去重 unrepeat_values = [value for value in set(dictionary.values())] print(unrepeat_values) 输出: ['jen', 'sarah', 'edward', 'phil'] ['jen', 'sarah', 'edward', 'phil'] ['Python', 'c', 'ruby', 'Python'] ['ruby', 'Python', 'c']
aliens = [] color = ('red', 'yellow', 'blue') for i in range(5): alien = {'color':color[i%3], 'score':(i+1)%3,} aliens.append(alien) print(aliens) 输出: [{'color': 'red', 'score': 1}, {'color': 'yellow', 'score': 2}, {'color': 'blue', 'score': 0}, {'color': 'red', 'score': 1}, {'color': 'yellow', 'score': 2}]
orders = {} spicy = ('wei la', 'zhong la', 'te la') acidity = ('bu jia', 'shao suan', 'duo suan') noodles = ('kuan', 'xi') for i in range(5): guest = [] #此处注意要放在里面初始化,否则会一直往后加 guest.append(spicy[i%3]) guest.append(acidity[i%3]) guest.append(noodles[i%2]) orders[f"guest{i}"] = guest print(orders) 输出: {'guest0': ['wei la', 'bu jia', 'kuan'], 'guest1': ['zhong la', 'shao suan', 'xi'], 'guest2': ['te la', 'duo suan', 'kuan'], 'guest3': ['wei la', 'bu jia', 'xi'], 'guest4': ['zhong la', 'shao suan', 'kuan']}
这里要注意一个点,列表的深复制和浅复制问题:
first_items = [1,2,3] second_items = first_items[:] dic = {'first':first_items, 'second':second_items} print(dic) #清除第一个列表 first_items.clear() print(dic) 输出: {'first': [1, 2, 3], 'second': [1, 2, 3]} {'first': [], 'second': [1, 2, 3]}
这里可以看到,当我们清除了第一个列表之后,字典的第一个键值对的值也被清除掉了,这就是浅复制的问题,即使第一个列表作为字典的第一个键值对的值存在,但是它和列表指向的是同一块内存,所以在列表被删除掉之后,该值也消失了,反观第二个深复制的列表就不存在这个问题。这样存在问题的同时在某些情况下也有好处,好处就是当我们改变列表的值时,在字典中会自动同步,不需要我们再次修改字典。
在上一段代码示例的for循环中,我们将guest列表的初始化放在for循环里,这样的效果是每个一循环开始,都会重新分配一块内存区域,这样就可以避免一直在一个列表末尾添加数据的问题,以及相应的进行深复制的问题。
students = { 'xiao ming':{ #这里使用冒号而不是等号 'class':1, 'number':111, }, #注意不要忘记逗号 'xiao hong':{ 'class':2, 'number':222 }, } print(students) 输出: {'xiao ming': {'class': 1, 'number': 111}, 'xiao hong': {'class': 2, 'number': 222}}