数据类型的常用操作和内置方法-下

数据类型的常用操作和内置方法下

字典内置方法

类型转换

字典的类型转换要求苛刻,一般不会使用

dict([['key1', 1], ['key2', 2]])  # 只能转换多元素的类型,且每个元素中还要有两个元素
# {'key1': 1, 'key2': 2}

常用操作与内置方法

  1. 按k取值

    user_list = {'kaka': '123', 'qiqi': '111', 'bobo':'765'}
    user_list['kaka']  # '123'
    user_list['bobo']  # '765'
    
  2. 用内置方法get取值(推荐)

    user_list.get('kaka')  # '123'
    
    - 键不存在的情况
    print(user_list.get('lulu'))  # None
    print(user_list.get('lulu', 'no key in this dict'))  # no key in this dict
    # get方法还可以加第二参数作为没有查找到键的返回信息
    
  3. 修改值的数据

    user_list['kaka'] = '110'  # 当键存在时,这一句就是修改对应的值
    user_list   # {'kaka': '110', 'qiqi': '111', 'bobo': '765'}
    
  4. 新增键值对

    user_list['lulu'] = '119'  # 当键不存在的时候,这一句就是新增键值对
    user_list   # {'kaka': '110', 'qiqi': '111', 'bobo': '765', 'lulu': '119'}
    
  5. 删除数据 —— del

    1.del通用关键字
    del user_list['qiqi']
    user_list  # {'kaka': '110', 'bobo': '765', 'lulu': '119'}
    
    2.pop弹出
    user_list.pop('bobo')  # '765'  会将对应的键值弹出
    user_list  # {'kaka': '110', 'lulu': '119'}
    
    '''   当键不存在的时候,程序会报错,两种方式都会
    >>> del user_list['bobo']
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    KeyError: 'ksd'
    '''
    
  6. 统计字典中键值对个数 —— len

    user_list = {'kaka': '110', 'lulu': '119'}
    len(user_list)  # 2
    
  7. 字典三剑客

    user_list = {'kaka': '110', 'qiqi': '111', 'bobo': '765', 'lulu': '119'}
    - 拿到所有键 —— keys()
    	user_list.keys()  # dict_keys(['kaka', 'qiqi', 'bobo', 'lulu'])
    - 拿到所有值 —— values() 也是用字典直接取到值的唯一方法
    	user_list.values()  # dict_values(['110', '111', '765', '119'])
    - 拿到所有键值对 —— items()
    	user_list.items()  # dict_items([('kaka', '110'), ('qiqi', '111'), ('bobo', '765'), ('lulu', '119')])
    

补充说明(使用频率低)

  1. 快速生成有默认值的字典 —— fromkeys
    dict.fromkeys(['name', 'age', 'gender', 'job'], 'default')
    # {'name': 'default', 'age': 'default', 'gender': 'default', 'job': 'default'}
    # 将一个列表之类的遍历一遍,作为键生成一个字典
    
    - 特殊例子,默认值是可变类型(面试题)
        user = dict.fromkeys(['name', 'age', 'gender', 'job'], [])
        # {'name': [], 'age': [], 'gender': [], 'job': []}
        user.get('name').append('leethon')
        user.get('age').append('age')
        user.get('gender').append('male')
        #  {'name': ['leethon', 'age', 'male'], 'age': ['leethon', 'age', 'male'], 'gender': ['leethon', 'age', 'male'], 'job': ['leethon', 'age', 'male']}
        """
        发现:默认值为可变类型,它们在改变时,值变化,内存地址不变,所以而每一个键后面的列表设置时就是同一个地址的列表,所以会同步变化
        """
    
  2. 添加键值对 —— setdefault
    # 当键存在时不操作,当键不存在时新增键值对
    user_list = {'kaka': '110', 'lulu': '119'}
    user_list.setdefault('kaka', '120')
    user_list  # {'kaka': '110', 'lulu': '119'}  # 没有变化
    user_list.setdefault('bobo','120')
    user_list  # {'kaka': '110', 'lulu': '119', 'bobo': '120'}  # 添加了新的键值对
    
  3. 弹出键值对
    # 接上文
    user_list.popitem()  # ('bobo', '120')
    # 遵循后进先出(LIFO),最后添加入字典的键值对,最先弹出
    

元组

类型转换

tuple()
# 可以转换可遍历的数字类型

常见操作

  1. 索引取值

    classes = ('1班', '2班', '3班', '4班', '5班', '6班', '7班')
    classes[1]  # '2班'
    
  2. 切片操作

    classes[1:5]  # ('2班', '3班', '4班', '5班')
    classes[-1:3:-2]  #  ('7班', '5班')
    # 同样也是那一套切片的逻辑
    # 切片产生的数据是元组类型的
    
  3. 统计元组元素个数

    len(classes)  # 7
    
  4. 统计元组内某个数据值的出现次数

    t1 = (1, 2, 3, 2, 2, 3, 2, 1, 2)
    t1.count(2)  # 5
    
  5. 得到元组指定数据值的索引值

    t1.index(2)   # 1
    
  6. 注意事项

    1.元组内如果只有一个元素,那么逗号不能少
    2.元组内索引绑定内存地址不能修改
    3.元组不能新增或删除类型
    

集合

集合的应用场景只有

  • 去重
  • 关系运算

去重(类型转换)

t1 = (1, 2, 3, 2, 2, 3, 2, 1, 2)
s1 = set(t1)  # 集合不存在重复的元素的特点让它具备去重的功能
t1 = tuple(s1)
t1  # (1, 2, 3)

关系运算

pro1 = {'python', 'go', 'javascript', 'c'}
pro2 = {'java', 'python', 'javascript', 'PHP'}
pro1 &  pro2  # 交集
pro1 - pro2  # pro1独有的
pro2 - pro1  # pro2独有的
pro1 |  pro2  # 并集
pro1 ^  pro2  # 各自独有的
pro1 >  pro2  # 判断包含
pro1 <  pro2  # 判断被包含
# 运行结果
>>> pro1 &  pro2  # 交集
{'python', 'javascript'}
>>> pro1 - pro2  # pro1独有的
{'go', 'c'}
>>> pro2 - pro1  # pro2独有的
{'java', 'PHP'}
>>> pro1 |  pro2  # 并集
{'java', 'c', 'javascript', 'go', 'python', 'PHP'}
>>> pro1 ^  pro2  # 各自独有的
{'java', 'c', 'go', 'PHP'}
>>> pro1 >  pro2  # 判断包含
False
>>> pro1 <  pro2  # 判断被包含
False
练习1
# 1.优化员工管理系统
#   拔高: 是否可以换成字典或者数据的嵌套使用完成更加完善的员工管理而不是简简单单的一个用户名(能写就写不会没有关系)
staff = {
    'jason': '123',
    'kevin': '123',
    'leethon': '123',
    'hunk': '123'
}
while True:
    # 展示功能,并要求输入
    order = input("""请选择功能:
    0:退出
    1:添加用户名
    2:查看所有用户
    3:删除指定用户名
    """)
    # 如果输入了功能以外的字符,则要求重新输入
    if order not in ['1', '2', '3', '0']:
        print('请输入有效代码')
        continue
    # 添加用户名功能
    if order == '1':
        username, inp_pwd = [
            input('请输入用户名:').strip(),
            input('请输入密码:').strip()
        ]
        staff.setdefault(username, inp_pwd)
    # 查看所有人功能
    elif order == '2':
        for member in staff.keys():
            print(member)
    # 注销账户功能
    elif order == '3':
        del_number = input('你要删除的用户名是:')
        if del_number in staff:
            del staff[del_number]

    # 退出程序的出口
    else:
        print('你已经退出程序')
        break
练习2
l1 = [2, 3, 2, 1, 2, 3, 2, 3, 4, 3, 4, 3, 2, 3, 5, 6, 5]
l2 = []
for i in l1:
    if i in l2:
        continue
    l2.append(i)
l1 = l2
print(l1)
练习3
# 3.有如下两个集合,pythons是报名python课程的学员名字集合,linuxs是报名linux课程的学员名字集合
pythons = {'jason', 'oscar', 'kevin', 'ricky', 'gangdan', 'biubiu'}
linuxs = {'kermit', 'tony', 'gangdan'}
# 1. 求出即报名python又报名linux课程的学员名字集合
# 2. 求出所有报名的学生名字集合
# 3. 求出只报名python课程的学员名字
# 4. 求出没有同时这两门课程的学员名字集合
print(pythons & linuxs)  # {'gangdan'}
print(pythons | linuxs)  # {'kermit', 'gangdan', 'tony', 'biubiu', 'kevin', 'oscar', 'ricky', 'jason'}
print(pythons - linuxs)  # {'kevin', 'ricky', 'oscar', 'biubiu', 'jason'}
print(pythons ^ linuxs)  # {'kermit', 'tony', 'kevin', 'ricky', 'oscar', 'biubiu', 'jason'}
练习4
# 4.统计列表中每个数据值出现的次数并组织成字典展示
#  eg: l1 = ['jason','jason','kevin','oscar']
#       结果:{'jason':2,'kevin':1,'oscar':1}
#  真实数据
#      l1 = ['jason','jason','kevin','oscar','kevin','tony','kevin']

l1 = ['jason', 'jason', 'kevin', 'oscar', 'kevin', 'tony', 'kevin']
l1_count = {}
for key in set(l1):
    l1_count[key] = l1.count(key)
print(l1_count)
posted @ 2022-09-30 17:15  leethon  阅读(56)  评论(0编辑  收藏  举报