《笨办法学 python3》系列练习计划——40.可爱的字典 dict

题目

听闻坊间流传,python 中的字典(dict)是不不少人喜爱的一种基础数据类型。相比列表(list)虽然同样是可变的容器型基础数据类型,但是字典在获取任何数据时的速度都是飞快,而列表则会随着长度的增加而不断损失速度。也许正是如此本题的题目才会是“可爱的”吧。下面我们将首先学习字典的基础知识,然后进行一个对应的练习。

新知识

字典(dict,全称 dictionary)在不同编程语言中的名字不同例如 “hash” 、“map”,它的形式很像我们使用的字典,有一个键 key 表示一个名字,还有一个值 value 表示键的数据。把键值对(key-value)方在大括号中就就是我们说的字典了。
不过我们先来看看列表和字典的区别。使用列表我们可以做下面的事情:

>>> things = ['a', 'b', 'c', 'd']
>>> print(things[1])
b
>>> things[1] = 'z'
>>> print(things[1])
z
>>> print(things)
['a', 'z', 'c', 'd']
>>>

我们想要使用列表中的一个元素,可以使用数字作为索引找到这个元素。而字典几乎任何东西作为“索引”,其实也就是 key 只不过需要注意 key 必须是不可变的数据类型(可参考 37题答案——数据类型)

>>> stuff = {'name': 'Zed', 'age': 36'height': 6*12+2}
>>> print(stuff['name'])
Zed
>>> print(stuff['age'])
36
>>> print(stuff['height'])
74
>>> stuff['city'] = "San Francisco"
>>> print(stuff['city'])
San Francisco
>>>

字符串是不能改变的,例如我收钱帮你买了一台 ’bpple’ 牌的 ‘NacBook’ 笔记本恐怕你就要着急了。字符串如果改变意思就不一样了,正如真正的字典一样。而数字也是不可变的,又如我给你换了台 2028 款的 MacBook,恐怕你不也还是不会安心到那里去(会不会因为我成功预测 apple 公司十年后的产品而免费得到一台呢 哈哈),所以数字也是可以用来作为字典的键

>>> stuff[1] = "Wow"
>>> stuff[2] = "Neato"
>>> print(stuff[1])
Wow
>>> print(stuff[2])
Neato
>>>print(stuff)
{'city': 'San Francisco', 2: 'Neato',
    'name': 'Zed', 1: 'Wow', 'age': 36,
    'height': 74}
>>>

注意到了么,字典中键值对的顺序是不固定的,它是无序的。此外,作为容器字典是可进可出的,我们可以使用 del 删除某一个键值对

>>> del stuff['city']
>>> del stuff[1]
>>> del stuff[2]
>>> stuff
{'name': 'Zed', 'age': 36, 'height': 74}
>>>

剩下的就是基础练习和加分练习了。

加分练习

  1. 在 Python 文档中找到 dictionary (又叫 dicts,dict)的相关内容,学着掌握 dict 的更多操作。
  2. 找到一些 dict 无法做到的事情。例如比较重要的是个就是 dict 的内容是无序的,可以检查一下是否真是这样。
  3. 试着把 for-loop 执行到 dict 上面,然后试着在 for-loop 中使用 dict 的 items() 函数,看看会有什么样的结果。




我的答案

40.0 基础练习

# 创建了一个包含多个城市名称的字典
cities = {'CA': 'San Francisco', 'MI': 'Detroit', 'FL': 'Jacksonville'}

# 为 cities 增加两个新的城市。
cities['NY'] = 'New York'
cities['OR'] = 'Portland'

# 创建一个函数,从字典中通过简写获得城市名称
def find_city(themap, state):    # map 是内置函数 所以使用了 themap
    if state in themap:
        return themap[state]
    else:
        return "Not found."

# ok pay attetion!
cities['_find'] = find_city

# 原文中 
#    print "State? (ENTER to quit)", 
#    state = raw_input("> ")
#
# 这种写法 python 3 似乎做不到了,参考打印的结果改下成了下面的写法
while True:
    state = input("State? (ENTER to quit) > ")
    if not state: break

    # this line is the most important ever! study!
    # 据说搞不懂的可以看看下一题
    city_found = cities['_find'](cities, state)
    print(city_found)

《笨办法学 python3》系列练习计划——40.可爱的字典 dict_第1张图片

40.1 字典的帮助文档

查看文档的方法大家应该都还记得吧,我的到了下面这些信息,按照惯例,为列出有下划线的方法

class dict(object)
 |  dict() -> new empty dictionary 
 |            创建一个新的空字典
 |  dict(mapping) -> new dictionary initialized from a mapping object's 
 |      (key, value) pairs
 |
 |  dict(iterable) -> new dictionary initialized as if via:
 |      d = {}
 |      for k, v in iterable:
 |          d[k] = v
 |      从可迭代对象创建字典
 |
 |  dict(**kwargs) -> new dictionary initialized with the name=value pairs
 |      in the keyword argument list.  For example:  dict(one=1, two=2)
 |      使用关键词参数创建
 |
 |  Methods defined here:
 |
 |  clear(...)
 |      D.clear() -> None.  Remove all items from D.
 |                  清空字典
 |
 |  copy(...)
 |      D.copy() -> a shallow copy of D
 |                  和列表类似是浅拷贝,如果子内容的列表或字典改变,
 |                   拷贝体的子内容也会改变。深拷贝则不会。
 |
 |  fromkeys(iterable, value=None, /) from builtins.type
 |      Returns a new dict with keys from iterable and values  equal to value.
 |        生成一个新字典,其键来自可迭代对象,默认值是 None
 |
 |  get(...)
 |      D.get(k[,d]) -> D[k] if k in D, else d.  d defaults to None.
 |          获取若干键的值,如果键不存在则返回 None
 |
 |  items(...)
 |      D.items() -> a set-like object providing a view on D's items
 |                  返回一个包含 键-值 的元祖的列表
 |
 |  keys(...)
 |      D.keys() -> a set-like object providing a view on D's keys
 |                  返回一个包含键的列表
 |
 |  pop(...)
 |      D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
 |      If key is not found, d is returned if given, otherwise KeyError is raised
 |                 移除指定的键值对,并返回值
 |
 |  popitem(...)
 |      D.popitem() -> (k, v), remove and return some (key, value) pair as a
 |      2-tuple; but raise KeyError if D is empty.
 |                  移除一对键值对,并以元祖返回键值对,
 |                  如果字典为空,则返回 KeyError
 |
 |  setdefault(...)
 |      D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D
 |          接受两个值,如 k,d 如果 k 是已经存在的键则返回值,
 |            如果键不存在,则 k 为键, d 为值存入字典
 |
 |  update(...)
 |      D.update([E, ]**F) -> None.  Update D from dict/iterable E and F.
 |      If E is present and has a .keys() method, then does:  for k in E: D[k] = E[k]
 |      If E is present and lacks a .keys() method, then does:  for k, v in E: D[k] = v
 |      In either case, this is followed by: for k in F:  D[k] = F[k]
 |          把字典或可迭代对象更新到当前字典
 |
 |  values(...)
 |      D.values() -> an object providing a view on D's values
 |            返回只包含值的列表

40.2 字典不能做的事情

和列表相比,可以看到字典本身就没有任何和顺序有关的操作,比如从前端加如元素、排序等

40.3 对字典使用 for 循环

总之,先按照要求做做看把。

d = {'1': 'a', '2': 'b', '3': 'c', '4':'d'}

# 使用 for 循环遍历字典
for k in d:
    print("当前的键是 %r, 它的值是:%r" % (k, d.get(k)))


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

字典在 for 循环中只能遍历出键,而不会遍历出对应的值。
遍历 d.items() 时则会获取到键值对组成的元祖,因此需要两个变量分别获取键和值。




返回目录

《笨办法学 python3》系列练习计划——目录

你可能感兴趣的:(Python)