08 - 字典

一.字典的优势(dict)

  • 一个元素位既能存储多个数据,还能在访问元素时很方便就能定位到需要的那个元素

  • 在习惯上:

    • 列表更适合保存多个商品、多个姓名、多个时间,这样的相似数据;
    • 字典更适合保存一个商品的不同信息、一个人的不同信息,这样的不同数据。

二.字典的使用

  • 定义字典的格式:

    {键1:值1, 键2:值2, 键3:值3, ..., 键n:值n}

  • 说明:

    • 字典中找某个元素时,是根据键名(就是冒号:前面的那个值,例如上面代码中的'name'、'id'、'sex')

    • 字典是不能通过下标或者切片去查找的

    • 字典的每个元素由2部分组成,键:值。

      例如 'name':'班长' ,'name'为键,'班长'为值

    • 键可以使用字符串、数字、布尔值、元组等不可变数据类型,但是一般习惯使用字符串

    • 每个字典里的key都是唯一的,如果出现了多个key,后面的value会覆盖前一个key对应的value.

三.字典的相关操作

1.查询元素

  • 直接使用['key']值去查找元素的value(不常用)

    info = {'name':'班长', 'id':100, 'sex':'f', 'address':'地球亚洲中国上海'}
    info['name']            #字典使用键来获取对应的值
    
    info2 = {'name':'班长','age':18}
    # print(info['sex'])    #获取不存在的key,会发生异常
    
  • 使用get:根据key得到value

    info = {'name':'班长', 'id':100, 'sex':'f', 'address':'地球亚洲中国上海'}
    value = info.get('name')   #班长
    info.get('id1')            #None
    info.get('sex1','无')       #无
    

    推荐使用:可以避免报错,没有key会返回默认值None,也可以自己设置,更加灵活

  • values:获取字典中所有的value。返回值是所有value组成列表的dict_values----就可以理解成存放到一个列表中

    book = {'书名': '三体', '作者': '刘慈欣', '价格': 40}
    print(book.values())          #dict_values(['三体', '刘慈欣', 40])
    
    for i in book.values():   #可以理解成values()放回的是列表,所以for循环一个一个从列表中将value取出来
        print(i,end=' ')      #三体 刘慈欣 40 
    
  • keys:获取字典所有的key----可以理解为将结果存放到一个列表中

    book = {'书名': '三体', '作者': '刘慈欣', '价格': 40}
    print(book.keys())       #dict_keys(['书名', '作者', '价格'])
    
  • item:详见4

2.添加元素/修改元素

  • 如果在使用 变量名['键'] = 值 时,这个“键”在字典中不存在,那么就会新增这个元素(键:值)

    info = {'name':'班长'}
    info['id'] = 100  # 为不存在的键对应的值赋值就是添加元素  {'name': '班长', 'id': 100}
    

    所以键的名字是不可修改,只能添加新的键:值元素

  • 如果键存在就会修改键对应的值

book = {}
book['书名'] = '三体'     #字典添加元素
book['作者'] = '刘慈欣'
book['价格'] = 40
print(book)
#{'书名': '三体', '作者': '刘慈欣', '价格': 40}

book['价格'] *= 0.8      #字典修改元素
print(book)
#{'书名': '三体', '作者': '刘慈欣', '价格': 32.0}

  • setdefault:(不常用)只能做添加键值对元素使用

    book = {'书名': '三体', '作者': '刘慈欣', '价格': 40}
    book.setdefault('出版社','人民出版社')             #将元素添加到字典的末尾
    
  • update:实现两个字典的合并

    book = {'书名': '三体', '作者': '刘慈欣', '价格': 40}
    source = {'出版社':'北京出版社','好评率':0.8}       
    book.update(source)         #将source字典合并到book字典的末尾
    print(book)
    
  • fromkey:根据key来创建字典,value只能写一个,写多个会当整体作为所有key的value

    result = dict.fromkeys(['a','b','c'],1)
    print(result)  #{'a': 1, 'b': 1, 'c': 1}
    
    result1 = dict.fromkeys(['a','b','c'],[1,2,3])
    print(result)  #{'a': [1, 2, 3], 'b': [1, 2, 3], 'c': [1, 2, 3]}
    

3.删除元素

  • clear:清空整个字典

    info = {'name':'monitor', 'id':100}
    info.clear()
    
  • del:带参数表示删除指定元素,不带参数表示删除整个字典

    info = {'name':'班长', 'id':100}
    del info['name']    #del 可以通过键删除字典里的指定元素
    
    info = {'name':'monitor', 'id':100}
    del info            #del 也可以直接删除变量
    
  • pop:根据key实现删除,删除的是键值对(整个元素)。有返回值----key对应的value

    book = {'书名': '三体', '作者': '刘慈欣', '价格': 40}
    book.pop('价格')
    print(r)         #40
    print(book)      #{'书名': '三体', '作者': '刘慈欣'}
    
  • popitem:无参,默认是从后往前删,一次删除一个键值对。有返回值----key和value组成的键值对

  • 举例:

    '''
    book = {}
    书名、价格、作者、出版社
    借了两本书:
    books = [{},{}]
    
    删除每一本书的出版社
    
    最终打印books
    '''
    books = [
        {'name':'三体','price':40,'author':'刘慈欣','出版社':'北京出版社'},
        {'name':'西游记','price':30,'author':'吴承恩','出版社':'上海出版社'}
        ]
    print(books)
    for book in books:
        book.pop('出版社')
    
    print(books)
    

4.字典的遍历

  • 如果直接使用for .. in遍历字典,取出的是字典的key

    book = {'书名': '三体', '作者': '刘慈欣', '价格': 40}
    for i in book:
    	print(i,end=' ')       #书名 作者 价格 
    
  • items:获取键值对----可以理解成返回的是多个元组组成的列表

    注意:通常我们都使用for k,v in book.items():的方式获取

    原理:因为items取出来的都是一对一对的元素,刚好要赋值给k,v,那么python底层会自动将key和value分别赋给k,v变量

    book = {'书名': '三体', '作者': '刘慈欣', '价格': 40}
    print(book.items())       #dict_items([('书名', '三体'), ('作者', '刘慈欣'), ('价格', 40)])
    
    for i in book.items():   
        print(i)
    #结果:
    '''
    ('书名', '三体')
    ('作者', '刘慈欣')
    ('价格', 40)
    '''
    
    for k,v in book.items():       
        print(k)
        print(v)
        #print(k,v)
    #结果:
    '''
    书名
    三体
    作者
    刘慈欣
    价格
    40
    '''
    

四.字典相关例题

'''
books = []    能放多本书
书:{}
书名 作者 价格

添加 三本书:
1.添加书不能添加重名书籍
'''
books = []
book = {}
while True:
    if len(books) == 3:
        break
    print('请添加书%d:' % (len(books) + 1))
    name = input('书名:')
    for book in books:      # 取出的是字典,当books列表为空时,就没有值赋给book,循环语句就不会进入
        print(book.get('name'))
        if name == book.get('name'):
            print('不能添加重名的书籍')
            break
    else:           # 当上面的for完整执行时进入else,如果有break或者没进去for就不进else
        author = input('作者:')
        price = input('价钱:')
        book['name'] = name
        book['author'] = author
        book['price'] = price
        books.append(book)
        print('{}添加成功!'.format(name))
        flag = False

print(books)          

易错:取出的是字典,当books列表为空时,就没有值赋给book,循环语句就不会进入

五.字典推导式

  • 和列表推导式类似,字典推导式是返回一个新的字典

    #将字典中元素的键值对颠倒
    dict1 = {'a' : 1,'b' : 2,'c' : 3}
    newdict = {v : k for k,v in dict1.items()}
    print(newdict)
    
posted @ 2021-10-14 18:50  深藏Bluee  阅读(208)  评论(0)    收藏  举报