7.字典

来源:互联网 发布:淘宝怎样设置运费模板 编辑:程序博客网 时间:2024/06/08 04:59
----------------字典----------------
(1)首先,解释一下何为映射?
     一种通过名字来引用值的数据结构,我们称之为映射。
     而字典是Python中唯一内建的映射类型。字典中的值没有特殊的顺序,但是都存储在一个特定的键(key)下。键可以是数字、字符串甚至是元组。


(2)创建和使用字典
  (2.1)创建字典
     —{}
     如:phonebook={"Alice": "2341", "Beth": "9102", "Cecil": "3258"}
     —dict函数
     可以用dict函数,通过其他映射或者对的序列建立字典。
     >>>items = [("name","Gumby"),("age",42)]     >>>d = dict(items)     >>>d     {"age":42,"name":"Gumby"}
    如果不带任何参数,dict函数返回一个空字典
    >>>dict()    {}
 (2.2)访问字典
    —直接使用key访问:key不存在会报错,可以使用in和not in判断。
    —循环遍历:
      例:
      >>>dic1={"name":"milo","gender":"male","age":25}      >>>for k in dic1:             print(k)      name      gender      age
    —使用迭代器:for key in dict1
  (2.3)基本字典操作
      字典的基本行为在很多方面与序列类似:
      ※len(d)返回d中项(键-值对)的数量;
      ※d[k]返回关联在键k上的值;
      ※d[k]=v将值v关联到键k上;
      ※del d[k]删除键为k的项;

      ※k in d检查d中是否含有键为k的项。


      尽管字典和列表有很多特性相同,但也有下面一些重要的区别。
      □键类型:字典的键不一定为整型数据(但也可以是),键可以是任意的不可变类型,比如浮点型(实型)、字符串或元组。
      □自动添加:即使键起初在字典中并不存在,也可以为它赋值,这样字典就可以建立新的项。而列表(在不使用append方法或其他类似操作的情况下)不能将值关联到列表                             范围之外的索引上。
      □成员资格:表达式k in d(d为字典)查找的是键,而不是值。表达式v in l(l为列表)则用来查找值,而不是索引。
         
(3)字典方法
  1.clear
    clear方法清除字典中所有的项。这个是原地操作,无返回值。
    >>> dic1={"name":"milo","age":25,"tel":"2584"}    >>> dic1    {'age': 25, 'tel': '2584', 'name': 'milo'}    >>> dic1.clear()    >>> dic1    {}
  2.fromkeys
    fromkeys方法用给定的键建立新的字典,每个键对应一个默认的值None。
    >>> dic1    {}    >>> dic1.fromkeys(["name","gender","address","ID","tel"])    {'tel': None, 'address': None, 'ID': None, 'gender': None, 'name': None

    如果不想使用None作为默认值,也可以自己提供默认值。
    >>> {}.fromkeys(["name","gender","address"],("unknow"))    {'address': 'unknow', 'gender': 'unknow', 'name': 'unknow'}
 3.get
   get方法是个更宽松的访问字典项的方法。一般来说,如果试图访问字典中不存在的项时会出错:
   >>> dic1={"name":"milo","age":25,"tel":"2584"}   >>> dic1   {'age': 25, 'tel': '2584', 'name': 'milo'}   >>> dic1["gender"]   Traceback (most recent call last):     File "<pyshell#13>", line 1, in <module>       dic1["gender"]   KeyError: 'gender'
   而用get就不会:
   >>> print(dic1.get("gender"))   None
   可以看到,当使用get访问一个不存在的键时,没有任何异常,而得到了None值。还可以自定义“默认”值,替换None:
   >>> dic1   {'age': 25, 'tel': '2584', 'name': 'milo'}   >>> dic1.get("address")   >>> print(dic1.get("address"))   None   >>> print(dic1.get("gender","no"))   no
   如果键存在,get用起来与普通的字典查询一样:
   >>> dic1.get("name")   'milo'
 4.pop
   pop方法用来获得给定键的值,然后将这个键值对从字典中移除。
   >>> x={'machine': ['bee', 'bar', 'baz'], 'username': 'mlh'}   >>> x.pop("machine")   ['bee', 'bar', 'baz']   >>> x   {'username': 'mlh'}
 5.items
   items方法将字典所有的项以列表方式返回,列表中的每一项都表示为(键,值)对的形式,但是项在返回时并没有遵循特定的次序。
   >>> d={   "title":"Python Web Site",   "url":"http://www.python.org",   "spam":0          }   >>> d.items()   dict_items([('spam', 0), ('url', 'http://www.python.org'), ('title', 'Python Web Site')])
 6.keys
   keys方法将字典中的键以列表形式返回。
   >>> d={   "title":"Python Web Site",   "url":"http://www.python.org",   "spam":0          }   >>> d.keys()   dict_keys(['spam', 'url', 'title'])
 7.values
   values方法将字典中的值以列表形式返回。
   >>> d={   "title":"Python Web Site",   "url":"http://www.python.org",   "spam":0          }   >>> d.values()   dict_values([0, 'http://www.python.org', 'Python Web Site'])
 8.update
   update方法可以利用一个字典更新另外一个字典。
   >>> d={"title":"Python Web Site","url":"http://www.python.org","changed":"Mar 14 22:09:15 MET 2008"      }   >>> x={"title":"Python Language Website","spam":0}   >>> d.update(x)   >>> d   {'url': 'http://www.python.org', 'title': 'Python Language Website', 'spam': 0,     'changed': 'Mar 14 22:09:15 MET 2008'}
 9.copy
   copy方法返回的是具有相同键值对的新字典,需要注意的是:这个方法实现的是浅拷贝!与此对应的是深拷贝!
   二者的区别,如下:
  【例1】
   >>> from copy import deepcopy   >>> d={"name":"milo","gender":"male","age":25} #d:原始字典   >>> c=d.copy() #c:浅拷贝   >>> dc=deepcopy(d) #dc:深拷贝   >>> d["name"]="Smith" #修改原始字典中的"name"值   >>> d   {'gender': 'male', 'age': 25, 'name': 'Smith'}    >>> c   {'gender': 'male', 'name': 'milo', 'age': 25}   >>> dc   {'gender': 'male', 'name': 'milo', 'age': 25}   >>> id(d)   52193080   >>> id(c)   52192760   >>> id(dc)   52192960
   可以看出,无论是深拷贝还是浅拷贝,原始字典与拷贝字典彼此独立占用内存空间。
   因此,修改原始字典的某一项时,不影响拷贝字典。

   明白了这一点之后,我们再看一个例子。
   【例2】
   >>> from copy import deepcopy      >>> d={"name":["Bob","milo","Mary"],"gender":"male"}#d:原始字典   >>> c=d.copy() #c:浅拷贝   >>> dc=deepcopy(d) #dc:深拷贝   >>> d["name"].append("Smith")#修改原始字典中的"name"值   >>> d   {'name': ['Bob', 'milo', 'Mary', 'Smith'], 'gender': 'male'}   >>> c   {'name': ['Bob', 'milo', 'Mary', 'Smith'], 'gender': 'male'}   >>> dc   {'name': ['Bob', 'milo', 'Mary'], 'gender': 'male'}
    看完此案例之后,普及一下:
    浅拷贝:只拷贝父对象,不会拷贝对象内部的子对象。
    深拷贝:拷贝父对象及其子对象。
    
    也就是说,
    ※当你改变原始字典一级目录下(父级)的对象时,不会对拷贝字典产生任何影响。
      因为 原始字典与拷贝字典彼此独立占用内存空间!

      当你改变原始字典子目录下的对象时,对浅拷贝字典产生直接影响,不影响深拷贝。
      因为 浅拷贝只拷贝父对象,不会拷贝对象内部的子对象,所以浅拷贝的子对象与原始字典保持一致!

      而深拷贝由于拷贝父对象及其子对象,所以对它而言,任何对原始字典的修改都与它无关!
   【例3】(不解释,检查一下你理解“深拷贝”与“浅拷贝”了吗?)
   >>> from copy import deepcopy   >>> x={"username":"admin","machine":["foo","bar","baz"]}   >>> y=x.copy()   >>> z=deepcopy(x)   >>> x["username"]="mlh"   >>> x["machine"][0]="bee"   >>> x   {'machine': ['bee', 'bar', 'baz'], 'username': 'mlh'}   >>> y   {'username': 'admin', 'machine': ['bee', 'bar', 'baz']}   >>> z   {'username': 'admin', 'machine': ['foo', 'bar', 'baz']}

----------------各种推导式----------------

   推导式分为列表推导式(list),字典推导式(dict),集合推导式(set)三种

(1)列表推导式。
     功能:一种方便的列表创建方法,
     格式:用中括号括起来,中间用for语句,后面跟if语句用作判读,满足条件的传到for语句前面用作构建先的列表

     例:
       >>> li=[i*2 for i in range(10) if i % 2 == 0]       >>> print li       [0, 4, 8, 12, 16]       >>>

(2)字典推导式。
     格式:跟列表推导式的用法差不多,只是不中括号改成大括号。

     例:#快速交换字典 键—值
       >>> mca={"a":1, "b":2, "c":3, "d":4}       >>> dicts={v:k for k,v in mca.items()}       >>> print dicts       {1: 'a', 2: 'b', 3: 'c', 4: 'd'}       >>>
 
(3)集合推导式。
     功能:跟列表推导式差不多,都是对一个序列的元素全部执行相同的操作,但集合是一种无序的序列。
     格式:1.不使用中括号,使用大括号;
           2.结果中无重复;
           3.结果是一个set()集合,集合里面是一个序列。

     例:
       >>> squared={i*2 for i in [1,1,2]}       >>> print squared       set([2, 4])       >>>


原创粉丝点击