本文共 4182 字,大约阅读时间需要 13 分钟。
注意这是第三版的《笨办法学Python》的内容,我后来发现第三版存在很大的问题,就放弃了第三版开始使用第四版,第四版的第38课是读代码,这里保留之前的手记,因为它们是有价值。
不在写第四课的手记,因为是读代码课。但是之后的课程手记全部是针对第四版的,第三版弃之不用了。
本节课内容较多,可以慢慢理解,虽然标题是列表,但实际其实是一种叫做字典(dict)的数据结构。
列表是有序排列的一些物件,而字典是将一些物件(keys)对应到另外一些物件(values) 的数据结构。这句话出自39课的常见问题解答。
原代码如下(缩进统一使用四个空格):
# create a mapping of state to abbreviationstates = { 'Oregon': 'OR', 'Florida': 'FL', 'California': 'CA', 'New York': 'NY', 'Michigan': 'MI', }# create a basic set of states and some cities in themcities = { 'CA': 'San Francisco', 'MI': 'Detroit', 'FL': 'Jacksonville'}# add some more citiescities['NY'] = 'New York'cities['OR'] = 'Portland'# print out some citiesprint '-' * 10print "NY State has: ", cities['NY']print "OR State has: ", cities['OR']# print some statesprint '-' * 10print "Michigan's abbreviation is: ", states['Michigan']print "Florida's abbreviation is: ", states['Florida']# do it by using the states then cities dictprint '-' * 10print "Michigan has: ", cities[states['Michigan']]print "Florida has: ", cities[states['Florida']]# print every state abbreviationprint '-' * 10for state, abbrev in states.items(): print "%s is abbreviated %s" % (state, abbrev)# print every city in stateprint '-' * 10for abbrev, city in cities.items(): print "%s has the city %s" % (abbrev, city)# now do both at the same timeprint '-' * 10for state, abbrev in states.items(): print "%s state is abbreviated %s and has city %s" % ( state, abbrev, cities[abbrev])print '-' * 10# safely get a abbreviation by state that might not be therestate = states.get('Texas', None)if not state: print "Sorry, no Texas."# get a city with a default valuescity = cities.get('TX', 'Does Not Exist')print "The city for the state 'TX' is: %s" % city
结果如下:
一块一块地来解释吧。
首先定义了字典,这里有两种定义(事实上第二种是在添加字典中的元素)的方式。
①
第一种: states = { ‘Oregon’: ‘OR’, ‘Florida’: ‘FL’, ‘California’: ‘CA’, ‘New York’: ‘NY’, ‘Michigan’: ‘MI’, } 第二种: cities[‘NY’] = ‘New York’ cities[‘OR’] = ‘Portland’而在使用时,以states[‘缩写’]的形式即可表示相应的字符串,这比数组强大的多,数组只能以基数来区分其中的元素,列表以缩写来区分,显然方便的多,使用时不再要求你记住数值,缩写是你在学英语时以及记住的东西。
②
print ‘-’ * 10 print “Michigan has: “, cities[states[‘Michigan’]] print “Florida has: “, cities[states[‘Florida’]]这里是嵌套调用,因为states和cities是在定义时就是嵌套定义的,所以可以嵌套使用,请记住这个用法。
③
print ‘-’ * 10 for state, abbrev in states.items(): print “%s is abbreviated %s” % (state, abbrev)abbrev也是一个关键字,是指列表中元素的缩写。states.item()会遍历states里面的所有内容。
④
state = states.get(‘Texas’, None) 这里涉及到get函数。描述:
Python 字典(Dictionary) get() 函数返回指定键的值,如果值不在字典中返回默认值。语法:
dict.get(key, default=None)
参数:
key – 字典中要查找的键。 default – 如果指定键的值不存在时,返回该默认值值。返回值:
返回指定键的值,如果值不在字典中返回默认值None。None是一个逻辑值,表示为假。所以if语句满足运行的条件,而最后一块代码中变量city中储存的值不是一个逻辑值而是字符串。其实本节课这种类型的列表变量还有专门的名字叫做字典(dict),字典由键和值组成,键是数据库里面的键(key),相当于我们日常生活中字典的页码,是一种索引或者说地址,每一个键都对应一个值。
Operation | Result |
---|---|
len(a) | the number of items in a 得到字典中元素的个数 |
a[k] | the item of a with key k 取得键K所对应的值 |
a[k] = v | set a[k] to v 设定键k所对应的值成为v |
del a[k] | remove a[k] from a 从字典中删除键为k的元素 |
a.clear() | remove all items from a 清空整个字典 |
a.copy() | a (shallow) copy of a 得到字典副本 |
k in a | True if a has a key k, else False 字典中存在键k则为返回True,没有则返回False |
k not in a | Equivalent to not k in a 字典中不存在键k则为返回true,反之返回False |
a.has_key(k) | Equivalent to k in a, use that form in new code 等价于k in a |
a.items() | a copy of a’s list of (key, value) pairs 得到一个键值的list |
a.keys() | a copy of a’s list of keys 得到键的list |
a.update([b]) | updates (and overwrites) key/value pairs from b 从b字典中更新a字典,如果键相同则更新,a中不存在则追加 |
a.fromkeys(seq[, value]) | Creates a new dictionary with keys from seq and values set to value 创建一个新的字典,键来自seq,值对应键对应的值 |
a.values() | a copy of a’s list of values 得到字典值的副本 |
a.get(k[, x]) | a[k] if k in a, else x 得到a[k],若存在返回x |
a.setdefault(k[, x]) | a[k] if k in a, else x (also setting it) 得到a[k],若不存在返回x,并设定为x |
a.pop(k[, x]) | a[k] if k in a, else x (and remove k) 弹出a[k],若不存在则返回x,同时将删除k键 |
a.popitem() | remove and return an arbitrary (key, value) pair 弹出a中对象的键和值,并删除弹出的键和值 |
a.iteritems() | return an iterator over (key, value) pairs 返回a中所有对象(键和值) |
a.iterkeys() | return an iterator over the mapping’s keys 返回a中所有键(索引) |
a.itervalues() | return an iterator over the mapping’s values 返回a中所有值 |
建议每天看一遍,一个星期之后就能牢记于心。也可以先记住本机课涉及的内容,碰到字典再来翻这一节课。