3、Python入门——数据容器


Python中的容器

  • 之前我们学的变量只能存储简单的,单一的数据,如果要同时存储多个值,变量就实现不了了。此时就需要用 容器类型 来实现。例如:存储咱们所有人的姓名, 年龄…
  • 分类
    ---- 字符串 (str)
    ---- 列表 (list)
    ---- 字典 (tuple)
    ---- 元祖 (dict)
    ---- 集合(set)

一、字符串

1. 介绍

1、概述:
     它属于容器类型的一种, 属于 不可变类型.  它由多个字符组成.
2、例如:
     'abc',  'hello world', '张三'...
3、定义格式:
     方式1: 一对引号, 单双引号均可.
     方式2: 三引号, 可以保留字符串的格式.

代码演示

# 1、通过 一对引号的方式 定义字符串, 单双引号均可.
s1 = '张三'
s2 = "李四"
print(s1, s2)    # 可以同时输出多个值. 打印结果:张三 李四

# 2、通过 三引号 的方式定义字符串.
s3 = """
select
    [distinct] 列1, 列2...
from
    表名
where
    组前筛选
group by
    分组字段
having
    组后筛选
order by
    排序字段 [asc | desc]
limit
    起始索引, 数据条数;
"""
print(s3)   # 打印结果 :  select
    					 [distinct]1,2...
						 from
   							 表名
					     where
   							 组前筛选
						 group by
     						 分组字段
						 having
    						 组后筛选
						 order by
    						 排序字段 [asc | desc]
						 limit
    						 起始索引, 数据条数;

# 3. 字符串特殊格式, 定义字符串变量, 记录:  I'm Tom!
s4 = "I'm Tom!"  # 为了防止跟语句中的单引号发生冲突,可以选择用双引号
s5 = 'I\'m Tom!' # \' 表示转义符, 即: 代表1个普通的单引号.
print(s4, s5)    # 打印结果:I'm Tom!

2. 字符串索引(下标)与切片

2.1 字符串索引(下标)

字符串索引详解:

"""
1、概述:
     Python中, 为了更好, 更方便的从字符串中获取到指定的内容, 给字符串的每个元素 提供的有索引.
     索引也叫: 下标, 角标, 编号等...
2、细节:
     1. Python中, 字符串的索引 有正向索引 和 逆向索引之分.
     2. 正向索引: 从左往右(从前往后)编号, 且 编号从 0 开始.
     3. 逆向索引: 从右往左(从后往前)编号, 且 编号从 -1 开始.
     4. 例如:
            字符串:       a      b       c       d       e       f       g
            正向索引:     0      1       2       3       4       5       6           
            逆向索引:    -7     -6      -5      -4      -3      -2      -1         
     5. 可以通过  字符串变量名[索引] 的形式, 从字符串中 获取到 指定的内容.
"""

代码演示

s1 = 'abcdefg'

# 2. 从字符串中获取指定内容, 并打印.
print(s1[2])        # 'c'
print(s1[-5])       # 'c'


print(s1[5])         # 'f'
print(s1[-2])        # 'f'


print(s1[3])        # 'd'
print(s1[-2])       # 'f'

2.2 字符串切片

字符串切片详解:

"""
1、概述:
     从字符串中 截取出 指定的内容 就称之为: 字符串切片.
2、格式:
     字符串变量名[起始索引:结束索引:步长]            包左不包右.
3、细节:
     1. 正向索引是从前往后(从左往右), 从 0 开始.
     2. 逆向索引是从后往前(从右往左), 从 -1 开始.
     3. 如果不写起始索引, 默认从: 0开始,
         如果不写结束默认, 默认到字符串末尾.
         如果不写步长, 默认是: 1
     4. 如果 索引 和 步长的方向相反, 获取不到数据.
     5. 特殊写法,  字符串[::-1] 表示反转字符串, 这个是面试题.

     例如:
        字符串:    a       b         c         d       e       f       g       h
        正向索引:  0       1         2         3       4       5       6       7
        逆向索引: -8      -7        -6        -5      -4      -3      -2      -1
"""

代码演示

# 1. 定义变量s1, 记录字符串内容.
s1 = 'abcdefgh'         

# 2. 演示字符串的切片.
print(s1[1:3])          # bc        不写步长, 默认是: 1
print(s1[:5])           # abcde     不写起始索引, 默认是: 0
print(s1[3:])           # defgh     不写结束索引, 默认到: 字符串最后
print(s1[1:5:2])        # bd        起始索引是1, 结束索引是5, 步长是2, 包左不包右.


print(s1[-6:-2])        # cdef, 不写步长, 默认是: 1
print(s1[-6:-2:1])      # 效果同上.

print(s1[-6:-2:-1])     # 不报错, 但是啥都没有.  因为查找的顺序是 -6到-2 从前往后, 而步长是-1, 顺序是 从后往前   查找和步长顺序相反, 无数据.
print(s1[-1:-5:-1])     # hgfe

print(s1[:-3])          # abcde
print(s1[-5:])          # defgh

print(s1[2:-3])         # cde
print(s1[-2:1])         # 不报错, 但是啥都没有.  查找方向 和 方向顺序不一致.
print(s1[-2:1:-1])      # gfedc

# 面试题
print(s1[:])            # abcdefgh, 即: 字符串本身.
print(s1[::-1])         # hgfedcba, 即: 反转字符串

print(s1[::-3])         # heb

3. 字符串遍历

  • 字符串遍历(也叫迭代, 即: 逐个获取 容器类型中 每个元素的动作)

代码演示

s1 = 'abcdefg'

# 方式1:直接遍历
for i in s1:
    print(i)        # i就是字符串s1中的 每个字符, 例如: a b c d e f g
    
# 方式2: 通过 索引 的方式遍历.
# print(s1[0])    # a
# print(s1[1])    # b
# print(s1[2])    # c
# print(s1[3])    # d
# print(s1[4])    # e
# print(s1[5])    # f
# print(s1[6])    # g
# len()函数返回的是字符串的长度 len(s1) = 7
for i in range( len(s1) ):  # i的值的范围: 0 ~ 7, 包左不包右.
    print(s1[i])    # 根据索引, 获取到每个字符.

4. 字符串常用函数方法

4.1 函数index和find、rindex和rfind

字符串函数介绍:

"""
1、概述:
     就是Python提供的, 可以直接操作 字符串变量 或者 字符串值的一些函数.
2、常用的 字符串查找类 相关的函数如下:
     字符串变量名.find(要查找的子串, 起始索引, 结束索引)      找子串在字符串中第一次出现的位置, 找到就返回子串的起始索引, 找不到就返回-1
     字符串变量名.index(要查找的子串, 起始索引, 结束索引)     找子串在字符串中第一次出现的位置, 找到就返回子串的起始索引, 找不到就报错.

     字符串变量名.rfind(要查找的子串, 起始索引, 结束索引)      找子串在字符串中最后一次出现的位置, 找到就返回子串的起始索引, 找不到就返回-1
     字符串变量名.rindex(要查找的子串, 起始索引, 结束索引)     找子串在字符串中最后一次出现的位置, 找到就返回子串的起始索引, 找不到就报错.
"""

代码演示

# 1. 定义变量, 记录字符串值.
#     0            13          25
s1 = 'hello python hello world hello sql'

# 2. 查找 hello 字符串在 s1中出现的索引.
# find()函数
print(s1.find('hello'))            # 0, 不写起始和结束索引, 默认是在 整个字符串中 查找的.
print(s1.find('hello', 2))         # 13,  从索引2的位置处, 开始查找.
print(s1.find('hello', 2, 17))     # -1, 因为是在 索引 2 ~ 17位置查找, 包左不包右.

# index()函数
print(s1.index('hello'))           # 0, 效果同上
print(s1.index('hello', 2))        # 13, 效果同上.
# print(s1.index('hello', 2, 17))  # 找不到就: 报错.

# rfind()函数, 最后一次出现的位置, 找不到返回 -1
print(s1.rfind('hello'))                    # 25
print(s1.rfind('hello', 2))        # 25
print(s1.rfind('hello', 2, 17))    # -1

# rindex()函数, 最后一次出现的位置, 找不到: 报错
print(s1.rindex('hello'))                    # 25
print(s1.rindex('hello', 2))       # 25
# print(s1.rindex('hello', 2, 17)) # 报错.

4.2 函数 replace 和 split

字符串函数介绍:

"""
1、概述:
     就是Python提供的, 可以直接操作 字符串变量 或者 字符串值的一些函数.
2、常用的 字符串 替换和切割类 相关的函数如下:
     字符串变量名.replace(旧子串, 新子串, 替换次数)   用新的替换旧的, 且可以设置替换几个(如超出真实旧子串个数, 则以实际为准)
     字符串变量名.split(分隔符, 切割次数)            按照分隔符切割, 且可以设置切割次数(如超出真实切割次数, 则以实际为准)
3、细节:
     因为字符串属于 不可变数据类型, 所以上述的函数操作字符串后, 会返回1个新的结果, 即: 旧字符串不变.
"""

代码演示

# 1. 定义变量, 记录字符串内容.
s1 = 'hello python hello sql hello pandas'

# 2. 用 numpy 来替换上述的 hello.
s2 = s1.replace('hello', 'numpy')            # 如果不写个数, 则会一次性替换所有.
s3 = s1.replace('hello', 'numpy', 2) # 只会替换2次(前2个)
s4 = s1.replace('hello', 'numpy', 5) # 超出真实个数, 则以实际为准.

# 3. 打印结果.
print(f's1: {s1}')      # hello python hello sql hello pandas
print(f's2: {s2}')      # numpy python numpy sql numpy pandas
print(f's3: {s3}')      # numpy python numpy sql hello pandas
print(f's4: {s4}')      # numpy python numpy sql numpy pandas

# 4. 测试split()函数.
s5 = 'hello python hello sql hello pandas'
list1 = s5.split(' ')                   # 切割后, 获取的是一个 字符串形式的列表, 即: ['hello', 'python', 'hello'...]
list2 = s5.split(' ', 2)   # 按空格切割, 只会切割2次(前2个), 即: 获取的元素个数为: 2 + 1 = 3个.
list3 = s5.split(' ', 9)   # 如果切割的个数超过真实个数, 则以实际为准.

# 5. 打印结果.
print(f's5: {s5}')          # hello python hello sql hello pandas
print(f'list1: {list1}')    # ['hello', 'python', 'hello', 'sql', 'hello', 'pandas']
print(f'list2: {list2}')    # ['hello', 'python', 'hello sql hello pandas']
print(f'list3: {list3}')    # ['hello', 'python', 'hello', 'sql', 'hello', 'pandas']

# 扩展: len()函数, 获取字符串的长度的, 即: 字符串有几个字符.
print(len(s1))          # 35


# 分隔符.join(字符串)  用分隔符隔开 字符串中的每个字符.
s4 = 'hello'
s5 = ','.join(s4)
print(s5)               # h,e,l,l,o

# 需求: 把 'hello' => ['h', 'e', 'l', 'l', 'o']
list3 = ','.join(s4).split(',')
print(list3)            # ['h', 'e', 'l', 'l', 'o']

4.3 函数 endswith

介绍

"""
1. 概述:
	 用来判断字符串中是否已某元素结尾
2. 格式
	 字符串名.endswith(要判断的元素)
"""

代码演示

# 定义一个字符串
s1 = 'rarfddsf'

# 打印结果
print(s1.endswith('f'))  # 若以 f 结尾返回True 否则返回 Flase

二、列表

1. 介绍

"""
1、概述:
      它属于容器类型的一种, 属于 可变类型. 它可以同时存储 多个元素.
2、格式:
      格式1:  列表名 = [值1, 值2, 值3...]
      格式2:  列表名 = list()
      格式3:  列表名 = []
3、细节:
      1. 列表可以同时存储多个元素, 可以是不同类型的, 也可以是同类型的元素.
      2. 实际开发中, 为了方便统一操作, 建议: 列表存储的多个元素 是 同类型.
      3. 列表的元素也是有索引的, 且索引也是从 0(正向), -1(逆向) 开始的.
      4. 列表和字符串一样, 也是支持 "切片" 操作的, 规则都一样:  列表名[起始索引:结束索引:步长]
"""

代码演示

# 1. 定义列表.
list1 = [10, 20.3, True, 'abc']
list2 = list()
list3 = []          

# 2. 打印列表(元素值)
print(f'list1: {list1}')    # list1: [10, 20.3, True, 'abc']
print(f'list2: {list2}')    # list2: []
print(f'list3: {list3}')    # list3: []

# 3. 打印列表(类型)
print(type(list1))  # <class 'list'>
print(type(list2))  # <class 'list'>
print(type(list3))  # <class 'list'>

# 4. 打印列表的 某个元素. 即: 测试列表的索引.
print(list1[1])       # 20.3, 正向索引
print(list1[-3])      # 20.3, 逆向索引.

2. 列表的遍历

"""
1、概述:
     逐个的获取容器类型中的每个元素的过程, 就称之为: 遍历.
2、遍历思路:
     思路1: for循环, 直接从 容器类型中获取每个元素.
     思路2: 采用 索引的 方式实现.
"""

代码演示

# 1. 定义列表.
list1 = [11, 22, 33, 44, 55]

# 2. 遍历列表.
# 思路1: 采用 for循环, 直接获取列表的每个元素.
for value in list1:
    print(value)

# 思路2: 采用 索引的 方式实现, while循环写法.
# print(list1[0])
# print(list1[1])
# print(list1[2])
# print(list1[3])
# print(list1[4])
i = 0
while i < len(list1):   # 细节: 不要直接写数值, 建议写成 列表的长度.
    print(list1[i])     # i 就是列表中每个元素的索引, 例如: 0, 1, 2, 3, 4
    i += 1
print('-' * 28)

# 思路2: 采用 索引的 方式实现, for循环写法.
for i in range(len(list1)):
    print(list1[i])     # i 就是列表中每个元素的索引, 例如: 0, 1, 2, 3, 4

3. 列表的常用操作方法

"""
1、概述:
     列表的常见操作指的是 列表元素的 增删改查的相关操作.
2、涉及到的函数如下:
     增 相关:
            列表名.append(任意变量即可)       往列表的末尾追加元素.并且只支持单个元素追加
            列表名.extend(必须是容器变量)     把容器类型中的每个变量都添加到 列表中.
            列表名.insert(索引, 元素)       往列表的指定位置插入元素.
     查 相关:
            列表名.index(元素, 起始索引, 结束索引)   去列表中查找指定的元素(第一次出现的位置), 找到就返回, 找不到就: 报错.
            列表名.count(元素)                    计数.
            变量名或者元素值 in 列表名              是否在.
            变量名或者元素值 not in 列表名          是否不在.
     删:
            列表名.pop(索引)                   删除指定索引位置的元素, 并返回被删除的元素.
            列表名.remove(元素)                删除指定元素, 删除第一个找到的元素.
            del 列表名[索引]                   删除指定索引位置的元素.
            del 列表名                        从内存中删除整个列表, 相当于该列表从未定义.
            列表名.clear()                    清空列表, 得到1个 空列表, 类似于: list1 = []
     改:
            列表名[索引] = 值
            列表名.reverse()                       反转列表元素内容.
            列表名.sort(key=None, reverse=False)   列表元素排序, key可以指定排序规则(后边讲), reverse表示升序还是降序, 默认是False(升序)

3、细节:
     1. append() 和 extend()的区别:
           区别1: 参数要求不同.
                append(): 可以传入 任意变量,只支持单个元素
                extend(): 必须传入 容器类型.
           区别2: 作用不同.
                append(): 把元素追加到末尾, 默认是 当做1个整体 来添加的.
                extend(): 把容器类型的每个元素, 逐个添加进来, 底层有遍历的动作.
     2. insert()函数是往指定的位置插入数据, 如果索引值不合法, 则会默认添加到 最前 或者 最后, 具体要看下的索引值.
     3. 列表属于可变类型, 所以其函数(例如: reverse(), sort()等)大多数都是直接修改 列表本身的.
"""

代码演示

# 需求1: 演示列表相关操作 增.
# 1. 定义列表.
list1 = ['a', 'b', 'c']

# 2. 演示 增 相关的函数.
#列表名.append(任意变量即可)       往列表的末尾追加元素.
list1.append('d')
list1.append('e','b')         # 报错,因为list.append()方法只接受一个参数,即要添加到列表末尾的元素  
list1.append('xyz')           # 是把 'xyz'当做整体来添加的.
# list1.append([10, 20, 30])  # 是把 列表 当做整体来添加的.

# 列表名.extend(必须是容器变量)     把容器类型中的每个变量都添加到 列表中.
# list1.extend(10)            # 报错.
# list1.extend('xyz')         # 字符串 = 容器类型.
# list1.extend([10, 20, 30])  # 字符串 = 容器类型.

# 列表名.insert(索引, 元素)       往列表的指定位置插入元素.
# list1.insert(1, 'd')           # 往 索引1的(前边)位置插入元素 d
list1.insert(-2, 'd')    # 往 索引-2的(前边)位置插入元素 d

# 3. 打印结果.
print(f'list1: {list1}')
print('-' * 30)

=============================================


# 需求2: 演示列表相关操作 查.
# 1. 定义列表.
list1 = ['a', 'b', 'c', 'd', 'b', 'd']

# 2. 演示列表的 查找 相关的函数.
# 列表名.index(元素, 起始索引, 结束索引)   去列表中查找指定的元素(第一次出现的位置), 找到就返回, 找不到就: 报错.
print(list1.index('b'))    # 1
print(list1.index('b', 2))              # 4,  从索引2开始查找, 元素b 在列表中的索引
# print(list1.index('b', 2, 4))    # 在索引区间 2 ~ 4之间查找 元素b, 包左不包右, 找不到就 报错.
print('-' * 30)

# 列表名.count(元素)                    计数.
print(list1.count('b'))               # 2次

# 变量名或者元素值 in 列表名              是否在.
print('d' in list1)     # True
print(10 in list1)      # False

# 变量名或者元素值 not in 列表名          是否不在.
print('d' not in list1)     # False
print(10 not in list1)      # True

=============================================

# 需求3: 演示列表相关操作 删.
# 1. 定义列表, 记录元素.
list1 = ['a', 'b', 'c', 'd', 'b', 'd']
print(f'删除前: {list1}')

# 2. 测试上述的方法.
# 列表名.pop(索引)                   删除指定索引位置的元素, 并返回被删除的元素.
# print(list1.pop(2))                # c
# print(list1.pop(5))                # 正常是可以的, 但是这里是报错, 因为上边删了一个元素, 就没有索引5了
# print(list1.pop(10))               # IndexError, 索引越界错误.


# 列表名.remove(元素)                删除指定元素, 删除第一个找到的元素.
# list1.remove(0)                  # ValueError, revmoe是根据元素值删除的.
# print(list1.remove('b'))         # 删除第1个匹配到的'b',  无任何返回, 如果打印, 结果是: None
# list1.remove('b')                  # 正确

# del 列表名[索引]                   删除指定索引位置的元素.
del(list1[2])
del list1[2]      # 写法同上.

# del 列表名                        从内存中删除整个列表, 相当于该列表从未定义.
# del list1
# del(list1)    # 写法同上.

# 列表名.clear()                    清空列表, 得到1个 空列表, 类似于: list1 = []
# list1.clear()

# 3. 打印结果.
print(f'删除后: {list1}')
print('-' * 30)

=============================================

# 需求4: 演示列表相关操作 改.
# 1. 定义列表, 记录元素.
list1 = ['a', 'b', 'c', 'd', 'b', 'd']
print(f'修改前: {list1}')

# 2. 演示列表的 改 相关操作.
# 列表名[索引] = 值
# list1[1] = 100

# 列表名.reverse()                       反转列表元素内容.
# list1.reverse()         # 扩展, 你可以通过 for循环 或者 while循环的方式, 自定义代码对列表内容进行反转.

# 列表名.sort(key=None, reverse=False)   列表元素排序, key可以指定排序规则(后边讲), reverse表示升序还是降序, 默认是False(升序)
# list1.sort()
# list1.sort(reverse=False)       # 效果同上, False = 不反转, 即: 升序.
list1.sort(reverse=True)          # True = 反转, 即: 降序.

# 3. 打印结果.
print(f'修改后: {list1}')

4. 列表的嵌套

"""
1、概述:
     所谓的列表嵌套指的是: 列表的元素还是1个列表, 这种写法就称之为: 列表嵌套.
2、格式:
     列表名 = [列表1, 列表2, 列表3...]
3、如何获取元素?
     方式1: 遍历.
     方式2: 列表名[外部列表的索引][内部列表的索引]
"""

代码如下(示例):

list2 = [[10, 20, 30], [40, 50], [60, 70, 80, 90]]

# 如何获取 50?
print(list2[1][1])

# 如何修改 60 => 666
list2[2][0] = 666

# 如何遍历上述的列表嵌套形式.
# 思路1: 直接获取元素值.
for inner_list in list2:
    # 因为 inner_list 还是1个列表, 所以我们接着遍历.
    # print(inner_list)
    for value in inner_list:
        print(value, end='\t')
    print()     # 打印完1个列表后, 记得加换行.
print('-' * 30)

# 思路2: 根据索引获取元素值.
for i in range(len(list2)):
    # print(i)          # 0, 1, 2 分别代表list2列表的 3个子列表的索引.
    # print(list2[i])   # list2[i] 就是列表list2的每个 子列表, 我们接着遍历.
    for j in range(len(list2[i])):
        # 具体的获取元素值的过程, 并打印.
        print(list2[i][j], end='\t')
    print()

三、元组

1. 介绍

"""
1、概述:
     它属于容器类型的一种, 属于 不可变类型.
     它也可以同时存储多个元素, 可以是不同类型的, 实际开发中, 建议存储: 相同类型的多个值.
2、特点:
     元组和列表的区别, 元组用小括号来表示, 且元组的 元素值不允许修改.
3、定义格式:
      t1 = (值1, 值2, 值3...)                        列表: list1 = [值1, 值2, 值3...]
      t2 = tuple()                                  列表: list2 = list()
      t3 = (值1, )
4、细节:
      1. 元组属于不可变类型, 其元素值不能更改.
      2. 元组和列表一致, 也是有索引的概念的.
      3. 定义元组时, 如果只有1个值, 则该值的末尾必须要加 逗号, 否则: 就是在定义1个普通的变量(即: 不是元组)
"""

代码如下(示例):

# 需求1: 演示如何定义元组.
# 1. 演示如何定义元组.
tuple1 = (10, 20, 30, 40, 50)
tuple2 = tuple()
tuple3 = ()
tuple4 = (10,)
tuple5 = (10)
tuple6 = ('aa')

# 2. 打印上述的变量.
print(tuple1)   # (10, 20, 30, 40, 50)
print(tuple2)   # ()
print(tuple3)   # ()
print(tuple4)   # (10,)
print(tuple5)   # 10
print(tuple6)   # aa

# 3. 打印上述的变量的 数据类型.
print(type(tuple1)) # <class 'tuple'>
print(type(tuple2)) # <class 'tuple'>
print(type(tuple3)) # <class 'tuple'>
print(type(tuple4)) # <class 'tuple'>
print(type(tuple5)) # <class 'int'>
print(type(tuple6)) # <class 'str'>

2. 元组索引 和 切片

# 需求2: 演示元组的 索引 和 切片操作.
tuple7 = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
# 根据索引, 获取 元组的元素值.
print(tuple7[3])           # 4

# 尝试修改元组的元素值.
# tuple7[3] = 200          # 报错, 因为元组内容是 不可变 的.

# 元组切片.
print(tuple7[2:6])         # [3, 4, 5, 6]

# 打印元组的内容.
print(f'tuple7: {tuple7}') #(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

3. 元组常用函数

# 需求3. 和列表, 字符串一样, 元组也是支持函数的, 例如: index(), count(), len()
t5 = ('a', 'b', 'c', 'd', 'e', 'b', 'd')

# 根据索引, 获取元组的内容.
print(t5.index('b'))     # 1
# print(t5.index('f'))   # 找不到, 就报错.

# count(), 统计元组中元素的个数.
print(t5.count('b'))     # 2

# len(), 统计元组的长度, 即: 元组的元素个数.
print(len(t5))

# 元组也支持索引, 可以通过 元组名[索引] 的方式获取数据.
print(t5[3])            # d


# 元组和列表最大的区别: 元组属于不可变类型, 其元素值不能改变.
# t5[1] = 'bb'
print(t5)

4. 细节问题, 即: 元组嵌套列表

# 需求4. 元组的细节问题, 即: 元组嵌套列表.
# 前提: 元组是属于容器类型的一种, 它属于 不可变类型, 
# 但是当: 元组嵌套列表的时候, 其内部列表的值是可以修改的, 但是 列表的地址值是不变的.
t1 = (1, 2, 3, ['a', 'b', 'c'])
print(f'修改前: {t1}')  # (1, 2, 3, ['a', 'b', 'c'])

# 需求, 把 'b' => 'z'
# print(t1[3])
t1[3][1] = 'z'

print(f'修改后: {t1}') # (1, 2, 3, ['a', 'z', 'c'])

四、字典

1. 介绍

"""
1、概述:
     它属于容器类型的一种, 存储的是 键值对数据, 它(字典)属于 可变类型.
2、定义格式:
     dict1 = {键:值, 键:值......}
     dict2 = {}
     dict3 = dict()
3、细节:
     1. 字典用 大括号 包裹.
     2. 字典存储的市 键值对形式的数据, 冒号左边的叫: 键, 右边的叫: 值.
     3. 键具有唯一性, 值可以重复.
"""

代码如下(示例):

# 1. 演示如何定义字典.
#         键       值      键   值       键值对数据
dict1 = {'name': '张三', 'age': 23, 'gender': 'male'}
dict2 = dict()
dict3 = {}
dict4 = {10, 20, 30, 40, 50}        # 这个可不是字典, 而是1个集合(set)

# 2. 打印字典.
print(dict1)    # {'name': '张三', 'age': 23, 'gender': 'male'}
print(dict2)    # {}
print(dict3)    # {}
print(dict4)    # {50, 20, 40, 10, 30}

# 3. 打印字典的类型.
print(type(dict1))  # <class 'dict'>
print(type(dict2))  # <class 'dict'>
print(type(dict3))  # <class 'dict'>
print(type(dict4))  # <class 'set'>

2. 字典的 常见操作

"""
1、演示字典的常用 函数 如下:
    增:  字典名[键名] =  值
    删:  del 字典名   或者 clear()
    改:  字典名[键名] =  值
    查:  get(), keys(), values(), items()
        # 字典名[key] 和 字典名.get(key)都能获取到其对应的value值,两者之间有什么不同:
        # 字典[key]的方法,key值不存在,会报错
        # get方法,key值不存在,不会报错,返回None

2、字典使用细节:
    1. 字典存储的是键值对元素, 键具有唯一性, 值可以重复.
    2. 字典属于可变类型, 其元素值可以修改.
"""

代码演示:

# 1. 定义变量, 表示: 字典.
dict1 = {'杨过':'小龙女', '郭靖':'黄蓉', '张无忌':'赵敏'}

# 2. 演示 字典相关的 函数.
# 增:  字典名[键名] =  值
dict1['段誉'] = '王语嫣'      # 键不存在, 就添加该键值对.

# 删:  del 字典名   或者 clear()
# dict1.clear()       # 清空元素(即: 删除所有的键值对)
# del dict1           # 从内存中删除该字典.
# del dict1['郭靖']     # 根据键, 删除该键值对.

# 改:  字典名[键名] =  值
dict1['段誉'] = '木婉清'

# 3. 打印字典内容.
print(f'dict1: {dict1}') # {'杨过': '小龙女', '郭靖': '黄蓉', '张无忌': '赵敏', '段誉': '木婉清'}


# 查:  get(), keys(), values(), items()
# get(键, 默认值)       根据键获取值, 如果键不存在, 就获取默认值.
print(dict1.get('杨过'))               # 小龙女
print(dict1.get('杨过', '李四'))       # 小龙女

print(dict1.get('乔峰'))               # None
print(dict1.get('乔峰', '张三'))       # 张三

# 注意两种获取key对应的value的值
print(dict1.get('乔峰'))               #返回None
print(dict1['乔峰'])   				   #报错 

# keys() 获取字典中所有的键.
print(dict1.keys())     # dict_keys(['杨过', '郭靖', '张无忌', '段誉'])

# values() 获取字典中所有的值.
print(dict1.values())   # dict_values(['小龙女', '黄蓉', '赵敏', '木婉清'])

# items()   把 每对键值对元素 封装成 元组, 然后再放到 列表中.
print(dict1.items())        # 列表 嵌套 元组, 即:  dict_items([('杨过', '小龙女'), ('郭靖', '黄蓉'), ('张无忌', '赵敏'), ('段誉', '木婉清')])

3. 字典的遍历

"""
字典遍历方式:
    思路1: 根据  键    获取其对应的值.             
    思路2: 根据 键值对 获取其对应的 键 和 值.    
"""

代码演示:

# 需求: 演示如何遍历字典, 即: 逐个的获取字典中键值对的过程.

# 1. 定义字典, 记录元素.
dict1 = {'name': '乔峰', 'age': 41, 'gender': '男', 'kongfu': '降龙十八掌'}


# 思路1: 根据 键 获取其对应的 值.  
# step1: 获取所有的键.
keys = dict1.keys()

# step2: 遍历, 获取到 每个键.
for key in keys:
    # key 就是字典的中的每个键, 根据键 获取值.
    value = dict1.get(key)
    # step3: 打印结果.
    print(key, value)
print('-' * 30)

# 上述格式简化版
for key in dict1.keys():
    print(key, dict1.get(key))
print('-' * 30)


# 思路2: 根据 键值对 找键和值.        
# step1: 获取所有的键值对.
items = dict1.items()
# step2: 遍历, 获取到每一组 键值对.
for item in items:
    # item就是每组键值对的 元组形式, 即: (键, 值)
    # step3: 从item中获取到 键 和 值.
    key = item[0]
    value = item[1]
    # step4: 打印结果
    print(key, value)

# 合并版.
for item in dict1.items():
    print(item[0], item[1])


# 最终版, 实际开发写法, 加入拆包, 目前了解即可,后续详解.
# item的格式为: (键, 值)
for k, v in dict1.items():
    print(k, v)

# 拆包
tuple1 = ('name', '乔峰')
k, v = tuple1     
print(k, v)  # 能获取到键值对的值

五. 集合

集合(set)是一个不重复无序的元素序列

介绍

"""
1、概述:
     它属于容器类型的一种, 其元素特点为: 无序, 唯一.
2、无序解释:
     这里的无序, 并不是排序的意思, 而是: 元素的存, 取顺序不一致, 例如: 存的时候顺序是1, 2, 3, 取的时候顺序是2, 1, 3
3、应用场景:
     去重.
4、set集合定义格式:
      set1 = {值1, 值2, 值3...}
      set2 = set()

"""

代码演示

# 1. 定义集合.
set1 = {10, 2, 'c', 5, 'a', 6, 3, 'b', 10, 5, 'a'}
set2 = set()
set3 = {}           # 注意:这个不是在定义集合, 而是在定义: 字典.

# 2. 打印变量的数据类型
print(type(set1))   # <class 'set'>
print(type(set2))   # <class 'set'>
print(type(set3))   # <class 'dict'>

# 3. 打印元素内容.
print(f'set1: {set1}')  # set1: {2, 3, 5, 6, 'a', 10, 'c', 'b'}
print(f'set2: {set2}')  # set2: set()
print(f'set3: {set3}')  # set3: {}

# 需求: 对列表元素值进行去重.
list1 = [10, 20, 30, 20, 10, 30, 50]

# 去重
# 思路1: 定义新列表, 遍历原始列表获取每个元素, 然后判断是否在新列表中, 不存在就添加.
list2 = []
for i in list1:
	if i not in list2
		list2.append(i)
print(list2)            # [10, 20, 30, 50]

# 思路2: list -> set, 会自动去重 -> list
set_tmp = set(list1)
list1 = list(set_tmp)

# 打印去重后的结果.
print(f'list1: {list1}') # [10, 20, 30, 50]

总结

  • 以上就是python中容器所涉及到的基本知识,涉及到的公共方法我们下一章在做讲解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值