zoukankan      html  css  js  c++  java
  • Python_元组、字典内建方法详解

    目录

    前言

    本篇补全元组、字典两种数据结构的内置方法的使用。想知道两种数据结构的详细介绍,请参考Python_数据结构篇,传送门:http://blog.csdn.net/jmilk/article/details/48391283

    软件环境

    • 系统
      • UbuntuKylin 14.04
    • 软件
      • Python 2.7.3
      • IPython 4.0.0

    元组Tuple

    元组是序列类型一种,也是不可变类型数据结构,对元组修改后会生成一个新的元组。所以Tuple对象并没有太多的内置方法。

    count() 查询一个元素在Tuple中的数量

    count(…)
    T.count(value) -> integer – return number of occurrences of value
    返回一个value在Tuple出现的次数,即个数。

    In [5]: tup = ('My','name','is','Jmilk')
    
    In [6]: tup.count('My')
    Out[6]: 1
    
    In [7]: tup.count('my')
    Out[7]: 0

    index() 查询元素在Tuple中的索引号

    index(…)
    T.index(value, [start, [stop]]) -> integer – return first index of value.
    Raises ValueError if the value is not present.
    返回在指定范围中[start,[stop]],第一次出现的value的索引。

    In [15]: tup.index('Jmilk',2,4)
    Out[15]: 3

    元组的遍历

    In [16]: tup
    Out[16]: ('My', 'name', 'is', 'Jmilk')
    
    In [17]: for i in tup:
       ....:     print i
       ....:     
    My
    name
    is
    Jmilk

    字典Dictionary

    字典数据类型使用键值对的映射关系来关联数据。

    创建一个字典对象

    简单的创建

    In [18]: dic = {'name':'Jmilk','age':23,'city':'BJ'}

    fromkey()使用keys来创建字典

    fromkeys(…)
    dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.
    v defaults to None.
    通过一个keys的序列来创建字典,可以指定keys映射的value,默认为None。

    In [125]: newDic = {}.fromkeys(['name','age','city'],'not found')
    
    In [126]: newDic
    Out[126]: {'age': 'not found', 'city': 'not found', 'name': 'not found'}

    查询

    查询字典中key映射的value

    In [44]: dic['age']
    Out[44]: 23

    get()查询Key映射的value,当key不存在时,返回默认值

    get(…)
    D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.
    自动添加(字典的默认值):自动添加是字典数据类型的特性,即使一个Key起初不存在于字典中,也可为Key分配一个值,以此来建立新的项。

    In [6]: dic
    Out[6]: {'age': 23, 'city': 'BJ', 'name': 'Jmilk'}
    
    In [7]: dic.get('age',24)
    Out[7]: 23
    
    In [8]: dic.get('a',24)
    Out[8]: 24

    若不使用get()函数去获取一个不存在的key对应的value时,会报错。

    len(dictName)获取字典长度

    len(…)
    len(object) -> integer
    Return the number of items of a sequence or mapping.
    len()是Python的内建函数,可以获取序列或字典的长度,即元素的个数。

    In [34]: len(dic)
    Out[34]: 3

    keys()列出dict的Keys列表

    keys(…)
    D.keys() -> list of D’s keys

    In [22]: dic.keys()
    Out[22]: ['city', 'age', 'name']

    values()列出dict的values列表

    values(…)
    D.values() -> list of D’s values

    In [23]: dic.values()
    Out[23]: ['BJ', 23, 'Jmilk']

    添加字典项

    通过赋值为字典添加一个项

    格式dictName[keyN] = valueN

    In [25]: dic
    Out[25]: {'age': 23, 'city': 'BJ', 'name': 'Jmilk'}
    
    In [27]: dic['sex'] = 'man'
    
    In [28]: dic
    Out[28]: {'age': 23, 'city': 'BJ', 'name': 'Jmilk', 'sex': 'man'}

    通过setdefault()增加

    setdefault(…)
    D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D
    当key存在时,call D.get(k,d)方法,即获取key映射的value。当key不存在时,执行D[k]=d,即为dict增加一个新的元素。

    In [25]: dic
    Out[25]: {'age': 23, 'city': 'BJ', 'name': 'Jmilk'}
    
    In [26]: dic.setdefault('age',24)
    Out[26]: 23
    
    In [27]: dic.setdefault('sex','man')
    Out[27]: 'man'
    
    In [28]: dic
    Out[28]: {'age': 23, 'city': 'BJ', 'name': 'Jmilk', 'sex': 'man'}

    删除字典项

    del语句,删除字典中key对应的一个项

    del语句可以操作所有的迭代器对象。

    In [40]: dic
    Out[40]: {'age': 23, 'city': 'BJ', 'name': 'Jmilk'}
    
    In [41]: del dic['age']
    
    In [42]: dic
    Out[42]: {'city': 'BJ', 'name': 'Jmilk'}

    popitem() 将随机一个字典键值对弹出(删除并返回)

    popitem(…)
    D.popitem() -> (k, v), remove and return some (key, value) pair as a
    2-tuple; but raise KeyError if D is empty.
    以tuple(k,v)的形式删除字典的一个元素,并返回。需要一个接受返回的对象。若字典为空,则报错。

    In [32]: dic
    Out[32]: {'age': 23, 'city': 'BJ', 'name': 'Jmilk', 'sex': 'man'}
    
    In [34]: dic.popitem()
    Out[34]: ('city', 'BJ')
    
    In [35]: dic.popitem()
    Out[35]: ('age', 23)

    pop()弹出key映射的value

    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

    In [39]: dic
    Out[39]: {'name': 'Jmilk', 'sex': 'man'}
    
    In [40]: dic.pop('name')
    Out[40]: 'Jmilk'

    一般情况下,当字典为空时调用了D.pop()方法的化会触发一个KeyError。但是也可以通过下面的调用方式来添加key不存在时的返回默认值。
    当Key不存在时,返回默认值,避免报错

    In [20]: dic
    Out[20]: {'age': 23, 'city': 'BJ', 'name': 'Jmilk'}
    
    In [21]: dic.pop('sex','man')
    Out[21]: 'man'

    clear()清空字典中的所有项

    clear(…)
    D.clear() -> None. Remove all items from D.
    清空所有项目,返回None。

    In [58]: dic
    Out[58]: {'age': 23, 'city': 'BJ', 'name': 'Jmilk'}
    
    In [59]: dic.clear()
    
    In [60]: dic
    Out[60]: {}

    修改

    简单的修改dict中key映射的value值

    格式:“`dictName[key] = newValue

    In [50]: dic['city'] = 'GZ'
    
    In [51]: dic
    Out[51]: {'age': 23, 'city': 'GZ', 'name': 'Jmilk'}

    update()更新字典

    update(…)
    D.update([E, ]**F) -> None. Update D from dict/iterable E and F.
    If E present and has a .keys() method, does: for k in E: D[k] = E[k]
    If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v
    In either case, this is followed by: for k in F: D[k] = F[k]
    使用另一个字典来更新一个字典,通过匹配的key来更新value。

    In [137]: dic
    Out[137]: {'age': 23, 'city': 'BJ', 'name': ['jmilk']}
    
    In [138]: newInfo = {'name':'chocolate','age':22,'city':'ZH'}
    
    In [139]: dic.update(newInfo)
    
    In [140]: dic
    Out[140]: {'age': 22, 'city': 'ZH', 'name': 'chocolate'}

    当然,也可以只更新其中若干个value。

    字典的复制

    copy()浅复制

    字典的浅复制与List的浅复制类似,都只是对引用对象的copy。

    In [107]: dic1 = dic.copy()
    
    In [108]: dic,dic1
    Out[108]: 
    ({'age': 23, 'city': 'BJ', 'name': ['jmilk', 'chocolate']},
     {'age': 23, 'city': 'BJ', 'name': ['jmilk', 'chocolate']})
    
    In [109]: dic1['age'] = 24
    
    In [110]: dic,dic1
    Out[110]: 
    ({'age': 23, 'city': 'BJ', 'name': ['jmilk', 'chocolate']},
     {'age': 24, 'city': 'BJ', 'name': ['jmilk', 'chocolate']})

    注意:对浅copy得到的新字典中的value做替换操作(替换整个value),是不会影响到元字典的。但是如果对新字典中的value做了修改操作(修改其中一部分),就会影响到原字典。如下:

    In [111]: dic1['name'].remove('chocolate')
    
    In [112]: dic,dic1
    Out[112]: 
    ({'age': 23, 'city': 'BJ', 'name': ['jmilk']},
     {'age': 24, 'city': 'BJ', 'name': ['jmilk']})

    因为两个key的id指向同一个数据对象,对数据对象做了修改(改变数据对象)后就会都受到影响。但替换(改变引用对象)整个value,即将新字典中key的id指向另一个数据对象,不会改变原数据对象。
    深copy和浅copy的详细介绍,请参考:http://blog.csdn.net/jmilk/article/details/49560989

    类型转换

    item() 将每个字典项,转化为Tuple和List的混合数据类型

    items(…)
    D.items() -> list of D’s (key, value) pairs, as 2-tuples

    In [42]: dic
    Out[42]: {'age': 23, 'city': 'BJ', 'name': 'Jmilk'}
    
    In [43]: dic.items()
    Out[43]: [('city', 'BJ'), ('age', 23), ('name', 'Jmilk')]
    
    In [44]: [x for param in dic for x in dic]   #嵌套列表降维
    Out[44]: ['city', 'age', 'name', 'city', 'age', 'name', 'city', 'age', 'name']  

    因为返回的是List类型对象,所以可以使用索引操作符。

    In [46]: dic.items()[0]
    Out[46]: ('city', 'BJ')
    
    In [48]: dic.items()[0][0]
    Out[48]: 'city'

    由此可以看出,可以对一个对象做 操作,主要由对象的类型来决定。

    成员关系

    判断一个kay是否存在dict中

    In [56]: dic
    Out[56]: {'age': 23, 'city': 'GZ', 'name': 'Jmilk'}
    
    In [57]: dic.has_key('age')
    Out[57]: True

    True ⇒ key存在dict中
    False ⇒ key不存在dict中

    使用成员关系运算符判断

    成员资格'age' in dic只能通过key的成员关系来判断。

    In [45]: dic
    Out[45]: {'age': 23, 'city': 'BJ', 'name': 'Jmilk'}
    
    In [46]: 'age' in dic
    Out[46]: True
    
    In [47]: 'age' not in dic
    Out[47]: False

    字典的遍历

    In [62]: dic
    Out[62]: {'age': 23, 'city': 'GZ', 'name': 'Jmilk'}
    
    In [63]: for key_num,val_num in dic.items():
       ....:     print key_num,val_num
       ....:     
    city GZ
    age 23
    name Jmilk                                               

    格式化输出value

    通过格式化%(key)format来输出映射的value

    In [53]: dic
    Out[53]: {'age': 23, 'city': 'BJ', 'name': 'Jmilk'}
    
    In [54]: print 'ple call me %(name)s,Thx!' % dic
    ple call me Jmilk,Thx!
    
    In [55]: print 'I m %(age)d years old.' % dic
    I m 23 years old.

    只要key in dict,就能使用任意的转换说明符。

    最后

    到本篇为止,序列类型的常用内置方法就介绍完了。往后就是一起学习Python类和文件操作等一些内容了 :)

    Jmilk

  • 相关阅读:
    [Give a try | Multithreading]The Practical Guide to Multithreading
    [SOLID]The Principles of OOD
    Mixing Native and Managed Types in C++
    [转载]关于大型软件重构的一些想法
    Mixed mode programming is the absolute power of C++/CLI
    Sample: Mixing Unmanaged C++, C++/CLI, and C# code
    添加删除虚函数带来的问题及解决办法
    如何阅读code base的组内讨论的总结
    如何快速定位一个函数的返回点(c/c++ Only)
    DirextX Training笔记
  • 原文地址:https://www.cnblogs.com/jmilkfan-fanguiju/p/11825227.html
Copyright © 2011-2022 走看看