Python基础【第八篇】:基础数据类型(字典)

字典

字典的特点

另一个非常有用的 Python 内建数据类型是字典 。字典在某些语言中可能称为联合内存 ( associative memories )或联合数组 ( associative arrays )。序列是以连续的整数为索引,称为有序列表。与此不同的是,字典以关键字 为索引,关键字可以是任意不可变类型,通常用字符串或数值,称为无序列表。

两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。

字典是一种映射类型,字典用"{ }"标识,它是一个无序的键(key) : 值(value)对集合。键(key)必须使用不可变类型,而值则不必要。

在同一个字典中,键(key)必须是唯一的,值则不必要。

如果元组中只包含字符串和数字,它可以做为关键字,如果它直接或间接的包含了可变对象,就不能当做关键字。不能用列表做关键字,因为列表可以用索引、切割或者append() 和extend() 等方法改变。

理解字典的最佳方式是把它看做无序的键: 值对 (key:value 对)集合,键必须是互不相同的(在同一个字典之内)。一对大括号创建一个空的字典:{} 。初始化列表时,在大括号内放置一组逗号分隔的键:值对,这也是字典输出的方式。

字典的主要操作是依据键来存储和析取值。也可以用del 来删除键:值对(key:value)。如果你用一个已经存在的关键字存储值,以前为该关键字分配的值就会被遗忘。试图从一个不存在的键中取值会导致错误。

怎么创建字典呢

dic = {} #创建一个空的字典
dic['key1'] = "百度"
dic['key2'] = "tencent"    #dic[key] = value
dic[1] = 'alibaba'
dic[2] = 'jingdong'
print("dic:",dic)
dic: {'key2': 'tencent', 2: 'jingdong', 'key1': '百度', 1: 'alibaba'}

将代码再运行一次,输出:

dic: {'key1': '百度', 2: 'jingdong', 1: 'alibaba', 'key2': 'tencent'}

可见字典里元素的存储是无序的,每次输出的位置不一样,并不是按索引来排序的。

我们还可以这样创造字典

dic = {'key1' : 'alibaba' , 'key2' : 'tencent' ,99 : 88}
#{键:值,键:值......}
print(dic)
#输出:
#{99: 88, 'key2': 'tencent', 'key1': 'alibaba'}

 字典元素的增删减查

字典里的元素是可以通过键值来进行增删改查的。

字典元素的查询

把相应的键值放到括号中进行访问,就像访问字符串一样,只是字符串括号里是索引:

dic = {'key1' : 'alibaba' , 'key2' : 'tencent' ,99 : 88}
print("键key1对应的值为:",dic['key1'])
print("键key2对应的值为:",dic['key2'])

此示例输出:

键key1对应的值为: alibaba
键key2对应的值为: tencent

注意:如果访问字典里不存在的索引则会出现错误。

字典元素的删除

删除字典里的键值;清空字典里的元素;删除整个字典。

dic = {'key1' : 'alibaba' , 'key2' : 'tencent' ,99 : 88}
#删除键key1
del dic['key1']
#清空字典里的元素
dic.clear()
#删除整个字典
del dic
字典元素的修改与增加

向字典添加新内容的方法是增加新的键/值对,修改或删除已有键/值对如下实例:

dic = {'key1' : 'alibaba' , 'key2' : 'tencent' ,99 : 88}
print('原始字典',dic)
dic["key3"] = 'baidu'
dic["key2"] = 'jingdong'
print("修改后的字典:",dic)

输出:

原始字典 {'key1': 'alibaba', 99: 88, 'key2': 'tencent'}
修改后的字典: {'key1': 'alibaba', 99: 88, 'key3': 'baidu', 'key2': 'jingdong'}

 


字典的内置方法

  •  len(dict)      计算字典元素个数,即键的总数。
    >>> dict = {'key1':'alibaba','key2':'baidu','key3':'tencent'}
    >>> len(dict)
    3
  • str(dict)     以字符串的形式输出字典
  • type(dict)    返回输入的变量类型,如果变量是字典就返回字典类型。
    >>> dict = {'key1':'alibaba','key2':'baidu','key3':'tencent'}
    >>> type(dict)
    <class 'dict'>
    >>> str1 = str(dict)
    >>> str1
    "{'key2': 'baidu', 'key1': 'alibaba', 'key3': 'tencent'}"
    >>> type(str1)
    <class 'str'>
  • dict.clear()      清楚字典里的元素。
  • dict.copy()        返回字典的一个浅拷贝,详解直接赋值、浅拷贝、深拷贝解析
  • dict.fromkeys(seq,value)     此方法返回一个由序列seq为键,value为所有键初始化的值的字典。使用字典dict直接调用。
    >>> seq = ['name','age','salary']
    >>> value = 20
    >>> dict.fromkeys(seq)
    {'name': None, 'age': None, 'salary': None}
    >>> dict.fromkeys(seq,value)
    {'name': 20, 'age': 20, 'salary': 20}
  • dict.get(key,default = None)       返回字典中键key对应的值,如果未找到则返回默认值default。
    >>> dict = {'name':'刘德华','age':18,'salary':200000}
    >>> dict.get('name')
    '刘德华'
    >>> dict.get('gender','male')
    'male'
    >>> dict.get('gender')
    >>> #返回None,并不会报错
  • key in dict      判断dict中是否有键key。
    dict = {'taobao':'马云','tencent':'马化腾','baidu':'李彦宏'}
    print('键taobao是否在字典中?','taobao' in dict)
    print('键alibaba是否在字典中?','alibaba' in dict)
    键taobao是否在字典中? True
    键alibaba是否在字典中? False
  • dict.items()      返回一个可遍历的(键, 值) 元组数组。
    >>> dict = {'taobao':'马云','tencent':'马化腾','baidu':'李彦宏'}
    >>> dict.items()
    dict_items([('taobao', '马云'), ('baidu', '李彦宏'), ('tencent', '马化腾')])
    >>> type(dict.items())
    <class 'dict_items'>
    #遍历字典列表
    dict = {'taobao':'马云','tencent':'马化腾','baidu':'李彦宏'}
    for key,value in dict.items():
          print('%s公司是%s的'%(key,value))
    taobao公司是马云的
    tencent公司是马化腾的
    baidu公司是李彦宏的
  • dist.keys()      返回一个由键组成的迭代器。注意:python2中是返回一个列表。
  • dist.values()    返回一个由值组成的迭代器。注意:python2中是返回一个列表。
    dict = {'taobao':'马云','tencent':'马化腾','baidu':'李彦宏'}
    print(dict.keys())
    print(dict.values())
    print(type(dict.keys()))
    print(type(dict.values()))
    print(list(dict.keys()))
    print(list(dict.values()))
    print(type(list(dict.keys())))
    print(type(list(dict.values())))

    输出:

    dict_keys(['baidu', 'tencent', 'taobao'])
    dict_values(['李彦宏', '马化腾', '马云'])
    <class 'dict_keys'>
    <class 'dict_values'>
    ['baidu', 'tencent', 'taobao']
    ['李彦宏', '马化腾', '马云']
    <class 'list'>
    <class 'list'>
  • dist.setdefault(key,value)       如果 key 在 字典中,返回对应的值。如果不在字典中,则插入 key 及设置的默认值 default,并返回 default ,default 默认值为 None。
    dict = {'taobao':'马云','tencent':'马化腾','baidu':'李彦宏'}
    print(dict.setdefault('taobao'))
    print(dict.setdefault('京东','刘强东'))
    print(dict)

    输出:

    马云
    刘强东
    {'taobao': '马云', 'tencent': '马化腾', 'baidu': '李彦宏', '京东': '刘强东'}
  • dict.update(dict1)     将字典dict1中的元素加到dict中,无返回值。
    >>> dict = {'Name': 'Runoob', 'Age': 7}
    >>> dict1 = {'sexy':'male','salary':2000}
    >>> dict.update(dict1)
    >>> dict
    {'Name': 'Runoob', 'Age': 7, 'sexy': 'male', 'salary': 2000}
  • dict.pop(key,default)      删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出。 否则,返回default值。
    dict = {'taobao':'马云','tencent':'马化腾','baidu':'李彦宏'}
    print('原始字典:',dict)
    delete_value = dict.pop('taobao','default')
    print("删除键‘taobao’对应的值‘%s’后的新字典:"%delete_value,dict)
    print(dict.pop('alibaba','default'))

    输出:

    原始字典: {'baidu': '李彦宏', 'taobao': '马云', 'tencent': '马化腾'}
    删除键‘taobao’对应的值‘马云’后的新字典: {'baidu': '李彦宏', 'tencent': '马化腾'}
    default
  • dict.popitem()      随机返回并删除字典中的一对键和值(一般删除末尾对)。如果字典已经为空,却调用了此方法,就报出KeyError异常。
    dict = {'taobao':'马云','tencent':'马化腾','baidu':'李彦宏','jingdong':'刘强东'}
    print('随机删除',dict.popitem())
    print("删除后的字典:",dict)

    输出:

    随机删除 ('jingdong', '刘强东')
    删除后的字典: {'baidu': '李彦宏', 'tencent': '马化腾', 'taobao': '马云'}

 Python直接赋值、浅拷贝、深拷贝解析

  • 直接赋值:其实就是对象的引用(别名)。

  • 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。

  • 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。

直接赋值、copy、deepcopy
id(list_original): 1208822144328
id(list_direct): 1208822144328
id(list_copy): 1208822144840
id(list_deepcopy): 1208822257224


list_original: ['alibaba', [1, 2, 3], 4, 5, 6]
list_direct): ['alibaba', [1, 2, 3], 4, 5, 6]
list_copy): ['alibaba', [1, 2, 3], 4, 5]
list_deepcopy): ['alibaba', [1, 2, 3], 4, 5]


list_original: ['alibaba', [1, 2, 3, 7], 4, 5, 6]
list_direct): ['alibaba', [1, 2, 3, 7], 4, 5, 6]
list_copy): ['alibaba', [1, 2, 3, 7], 4, 5]
list_deepcopy): ['alibaba', [1, 2, 3], 4, 5]
输出

直接赋值:

list_original和list_direct指向的是同一个对象。

使用copy方法拷贝:

list_original和list_copy是两个独立的对象,但他们的子对象还是指向统一对象(是引用)。

使用deepcopy拷贝:

list_original和list_deepcopy是两个独立对象,他们的子对象也是独立对象。

 

 

posted @ 2018-08-27 19:35  焕熊  阅读(200)  评论(0)    收藏  举报