xiaoqiyan 的个人博客

记录精彩的程序人生

Open Source, Open Mind,
Open Sight, Open Future!
  menu
15 文章
0 评论
7238 浏览
0 当前访客
ღゝ◡╹)ノ❤️

Python学习之第三章 列表、元组和字典

第三章 列表、元组和字典

3.1 组合数据类型

  1. 序列类型

序号访问单个元素是直接使用编号如 list[0],首元素是从 0(-n)开始的,而不是 1,末元素编号是 n-1(也可以是-1)

切片操作:比如说 list[1:8]就是第二个元素到第八个元素(7)不包含第九个元素

3.2 列表

3.2.1 列表的基本操作

例 3.1 创建列表

""" 创建列表 """

list1 = []
list2 = ["MUC", "Python", 1, 2, 3]
list3 = list("Hello!Python")

print(list1)
print(list2)
print(list3)

知识点:

  1. 使用方括号将一组 Python 对象括起来,各个对象之间用逗号分隔,就创建了一个列表,也可以创建一个空列表
  2. 可以使用 list()函数创建列表,如果带的参数是字符串,则会将字符串中的每个字符解析成列表的元素

例 3.2 访问列表

""" 访问列表 """
lst = ["MUC", "Python", 1, 2, 3, "Hello"]
print(lst[1])  # 输出第二个元素
print(lst[1:3])  # 输出第二,第三两个元素
print(lst[0: 5: 2])  # 从第一个到第第五个元素之间,步长为2输出,1,3,5三个元素

知识点:

  1. 列表元素使用列表名加下标进行访问,列表的首元从下标 0 开始依次递增;也可以从末元素开始倒序进行标示,末元素下标为-1 倒序依次往前递减。
  2. 访问列表元素时可以指定开始位置和结束位置,从而实现多个元素的访问和抽取,这个操作称为切片操作,在切片操作时还可以在切片范围后指定步长。
  3. 列表的切片操作时,包含指定的第一个元素,不包含区间最后一个元素;若从指定元素一直取到列表最后一个元素,可以省略区间范围后面的数字;不能够指定超出列表范围的数字,否则就会出错。

例 3.3 更新和删除列表中的元素

lst = ["MUC", "Python", 1, 2, 3, "Hello"]
print(lst)
lst[2:5] = 4, 5, 6
print(lst)
lst[2] = 'Sec'
print(lst)
del lst[2]
print(lst)
lst.append('Sec')
print(lst)
lst.pop()
print(lst)
lst.pop(0)
print(lst)

知识点:

  1. 可以使用下标方法更新指定列表元素的值,也可以更新切片元素的多个值。
  2. 可以使用 appendo 方法追加新的列表元素,追加的元素放在列表的最后。
  3. 删除列表中元素:
    1. 使用 del 语句
    2. 使用 remove()方法删除指定内容
    3. 使用 pop()方法删除指定位置元素,如不指定则为删除末尾元素

3.2.2 列表常用操作符

例 3.4 列表操作符

lst1 = ['hello', 'hi', 'hiya']
lst2 = [1, 2, 3]
print(lst1+lst2)
lst3 = lst2*3
print(lst3)
print(lst1*2)
print('hiya' in lst1)
print('howday' not in lst1)
print('hi' in lst2)

结果:
['hello', 'hi', 'hiya', 1, 2, 3]
[1, 2, 3, 1, 2, 3, 1, 2, 3]
['hello', 'hi', 'hiya', 'hello', 'hi', 'hiya']
True
True
False

知识点:

  1. 列表的连接: 使用+直接连接,但是这种方法的代价比较大,建议使用 extend()
  2. 列表操作符
操作符 功能描述
>,<,>=,<=,==,!= 对象值比较
is, not is 对象值身份比较
not, or, and 布尔运算符
in, not in 成员关系运算符
+ 连接操作符
* 重复操作符
[],[:],[::] 切片操作符
  1. 两个列表比较时,如果都只有一个元素,就直接比较大小
  2. 如果有多个元素,先比较第一个元素,哪个列表第一个元素大,则该列表大,相等比较后面的,以此类推。

3.2.3 列表常用函数或方法

3.5 列表处理(使用内置函数)

lst1 = [1, 2, 3, 4, 5, 6]
lst2 = ['a', 'b', 'c', 'd', 'e']
print(str(lst1))
print(str(lst2))
print(len(lst1))
print(max(lst1))
print(min(lst2))
print(reversed(lst2))
for i in reversed(lst1):
    print(i)

lst3 = [2, 1, 5, 4, 6, 3]
print(sorted(lst3))
print(lst3)
lst4 = sorted(lst3)
print(lst4)
print(sum(lst1))
for i, j in zip(lst1, lst2):
    print(i, j)

运行结果:
[1, 2, 3, 4, 5, 6]
['a', 'b', 'c', 'd', 'e']
6
6
a
<list_reverseiterator object at 0x0000022308A467C0>
6
5
4
3
2
1
[1, 2, 3, 4, 5, 6]
[2, 1, 5, 4, 6, 3]
[1, 2, 3, 4, 5, 6]
21
1 a
2 b
3 c
4 d
5 e

例 3.6 列表处理(使用方法)

lst = ['b', 3, 'd', 2, 'c', 1, 'a', 5, 4, 'e']
print(lst)
lst.reverse()
print(lst)
lst.append('f')
print(lst)
lst0 = [0, 6, 'g']
lst.extend(lst0)
print(lst)
lst.insert(0, 0)
print(lst)
print(lst.count(0))
print(lst.index(0))
print(lst.index(5))

运行结果:
['b', 3, 'd', 2, 'c', 1, 'a', 5, 4, 'e']
['e', 4, 5, 'a', 1, 'c', 2, 'd', 3, 'b']
['e', 4, 5, 'a', 1, 'c', 2, 'd', 3, 'b', 'f']
['e', 4, 5, 'a', 1, 'c', 2, 'd', 3, 'b', 'f', 0, 6, 'g']
[0, 'e', 4, 5, 'a', 1, 'c', 2, 'd', 3, 'b', 'f', 0, 6, 'g']
2
0
3

知识点:

  1. 处理列表的内置函数和方法

    1. 内置函数
      1. str()将列表转成字符串
      2. len()计算列表中元素个数
      3. min()找列表中最小值
      4. reversed()将列表中数据逆序排列
    2. 常用方法
  2. 内置函数 sorted()和列表方法 sort()区别

    sort()方法直接在原列表上操作,sorted()不改变原来的列表

    不同类型的数据不能混合来排序

3.7 将若干同学的某门课程的成绩存入到一个列表中,实现成绩列表的添加,删除,排序,输出前五名成绩的相关操作

score_python = [65, 88, 79, 95, 100, 58, 81, 58, 90, 77]
score_python.append(33)
print(score_python)
print(score_python.index(100))
score_python.insert(4, 99)
print(score_python)
score_python.remove(99)
score_python.pop()
print(score_python)
score_python.sort(key=None, reverse=True)
print(score_python)
print(score_python[0:5])

结果:
[65, 88, 79, 95, 100, 58, 81, 58, 90, 77, 33]
4
[65, 88, 79, 95, 99, 100, 58, 81, 58, 90, 77, 33]
[65, 88, 79, 95, 100, 58, 81, 58, 90, 77]
[100, 95, 90, 88, 81, 79, 77, 65, 58, 58]
[100, 95, 90, 88, 81]

构建一个学生成绩的信息列表,要求表中的每个元素又是一个包含学生基本信息(学号、姓名、成绩)的列表数据,程序能够实现学生信息的添加,删除,统计,排序等操作。

score = [[1901, '张三', 80], [1902, '李四', 69], [
    1903, '王二', 70], [1904, '赵六', 68], [1905, '孙七', 58]]
for item in score:
    print(item)
print("******><><******")
while(1):
    print("1.增加一条学生成绩")
    print("2.按照学号删除成绩")
    print("3.全部学生成绩平均值")
    print("4.输出成绩的前三名")
    print("0.Exit")
    choice = int(input("请输入你的选择:").strip(" "))
    if choice == 0:
        break
    elif choice == 1:
        new_score = input("按学号、姓名和成绩的顺序输入一条信息(逗号隔开):\n").strip(" ")
        new_score = new_score.strip(" ").split(",")
        new_score[0] = int(new_score[0])
        new_score[2] = int(new_score[2])
        score.append(new_score)
    elif choice == 2:
        num = int(input("请输入要删除的学号:").strip(" "))
        for item in score:
            if item[0] == num:
                score.remove(item)
                break
    elif choice == 3:
        sum = 0
        for item in score:
            sum += item[2]
        average = sum/len(score)
        print(average)
    elif choice == 4:
        score.sort(key=lambda x: x[2], reverse=True)
        print(score[0:3])
    else:
        print("编号输入错误!")

知识点:

  1. 字符串处理:字符串常用操作包括:替换、删除、截取、赋值、连接、比较、查找、分割等。

    1. strip()方法可以移除字符串头尾指定的字符或字符串,返回删除后得到的新序列
    2. slip()方法是对字符串进行分隔
  2. 转义字符

    1. 输出特殊字符
    2. 表示一些特殊的控制字符,如\r(回车),\n(换行符),\t(制表符)
    3. 如 s='It's me',会报错应该写成 s='It's me'
    4. 如果在字符串中要使用''时就要写成'\'
  3. lambda 表达式

    常用形式:lambda 形参 1,形参 2...........:表达式

    如 add=lambda a,b:a+b
    print(add(6,8))
    结果:14
    
  4. 升序和降序

    1. 不指定参数默认是升序排列
    2. 带参数:sort(key=None,reverse=True)
      1. key 是可以指定对哪些元素进行排序
      2. reverse 指定排序规则,True 降序,False 升序

巩固与拓展:

  1. 编写程序,从 0-9 十个数字当中随机抽取 4 个数字,组成一个随机数密码
import random
list = []
for i in range(4):
    list.append(random.randint(0, 9))
print(list)
  1. 编写程序,用冒泡排序算法对列表内的数字元素进行排序,排序完成后分别打印排序前后的列表内容
lst = [5, 2, 3, 9, 4, 1, 8, 2, 3, 4, 7]
print("排序前:")
print(lst)
n = len(lst)
for i in range(n):
    for j in range(0, n-i-1):
        if lst[j] > lst[j+1]:
            t = lst[j]
            lst[j] = lst[j+1]
            lst[j+1] = t
print("排序后:")
print(lst)

运行结果:
排序前:
[5, 2, 3, 9, 4, 1, 8, 2, 3, 4, 7]
排序后:
[1, 2, 2, 3, 3, 4, 4, 5, 7, 8, 9]

3.3 元组

元组是序列数据类型,和列表有很多相似的地方,但是又和列表有根本上的不同,元组属于不可变对象,而列表是可变的对象。

例 3.9 创建元组

tp1 = ('MUC', 'Python', 2020)
print(tp1)
print(type(tp1))
lst = ['abc', 'xyz', 123]
print(lst)
print(type(lst))
tp2 = tuple(lst)
print(tp2)
print(type(tp2))
print(tp2[-1])
tp = tp1[0]+tp2[0]
print(tp)
tp1 = tp1+tp2[0:2]
print(tp1)

运行结果:
('MUC', 'Python', 2020)
<class 'tuple'>
['abc', 'xyz', 123]
<class 'list'>
('abc', 'xyz', 123)
<class 'tuple'>
123
MUCabc
('MUC', 'Python', 2020, 'abc', 'xyz')

知识点:

  1. 使用圆括号将一组 Python 对象括起来,各个对象之间用逗号分隔,就创建了一个元组也可以使用空的圆括号创建一个空元组;还可以使用 tuple 函数创建元组。
  2. 若使用圆括号创建只有一个元素的元组时,要在元素后加上逗号,否则不能创建一个元组。
  3. 元组与列表一样,可以使用下标进行索引访问,下标索引从 0 开始;也可以从最后个元素开始按照负数逆序进行索引访问;还可以进行切片操作。
  4. 元组中的元素值不可以修改,但可以对元组进行连接操作,使得原先的元组指向新的元组组合;注意修改元组内的元素和元组的重新组合是两个概念。
  5. del 语句操作可以删除元组,在上例中最后删除 tp2 组后,再次访问 tp2 则会出现错误提示。

例 3.10 对特定元组进行操作,理解元组的独特性

tp = ('MUC', 'Python', 2020, ['abc', 'xyz', 123])
print(tp)
tp[3][2] = 'end'
print(tp)
结果:
('MUC', 'Python', 2020, ['abc', 'xyz', 123])
('MUC', 'Python', 2020, ['abc', 'xyz', 'end'])

知识点:

  1. 如果一个元组中的元素是可变对象,那么这个可变对象是可以修改的,仅限于可变对象的元素。
  2. 对于一组用逗号隔开的数据,没有明确定义时,Python 默认该组数据是元组数据。
  3. 元组和列表可以通过相应的函数转换
  4. 元组的其他运算符操作与列表是一致的,元组的内置函数和方法操作则是和序列的方法和函数一致

3.4 字典

字典是映射数据类型,是键值对元素组成的无序集合,键是不可变对象且不能重复,而值是可以改变的。且可以重复出现。

3.4.1 字典的基本操作

例 3.11 创建字典数据,并对字典数据进行简单的操作

dict1 = {}
print(dict1)
print(type(dict1))
dict2 = {'Jerry': 8, 'Tom': 5, 'Mary': 10}
print(dict2)
dict3 = {'name': 'Tom', 'Age': 22, 'Sex': 'male', 123: 'China USA US'}
print("dict2['Jerry']:", dict2['Jerry'])
dict2['Tom'] = 7
dict2['Mary'] = 12
print(dict2)
del dict3[123]
print(dict3)
dict3.clear()
print(dict3)

运行结果:
{}
<class 'dict'>
{'Jerry': 8, 'Tom': 5, 'Mary': 10}
dict2['Jerry']: 8
{'Jerry': 8, 'Tom': 7, 'Mary': 12}
{'name': 'Tom', 'Age': 22, 'Sex': 'male'}
{}

知识点:

  1. 字典的键是不可变对象,在命名是可以使用数字,字符串或者是元组,但是不能是可变对象如列表。
  2. 访问是用键来作为索引的,删除单个使用 del,清空字典使用 clear()方法,

3.4.2 字典的内置函数和方法

例 3.12 使用字典的内置函数和方法对字典数据进行操作

dict2 = {'Jerry': 8, 'Tom': 10, 'Lily': 9}
print(len(dict2))
print(type(dict2))
print(str(dict2))
print(dict2.items())
print(dict2.keys())
print(dict2.values())
print(dict2.get('Lily', 20))
print(dict2.get('Luck', 18))
print(dict2.pop('Lily', 20))
print(dict2.popitem())
print(dict2)
dict3 = dict2.fromkeys('ABCDEF', 9)
print(dict3)
print(dict2)
dict3.update(dict2)
print(dict3)
dict2.setdefault('Jerry', 16)
print(dict2)
dict2.setdefault('Lily', 10)
print(dict2)

运行结果:
3
<class 'dict'>
{'Jerry': 8, 'Tom': 10, 'Lily': 9}
dict_items([('Jerry', 8), ('Tom', 10), ('Lily', 9)])
dict_keys(['Jerry', 'Tom', 'Lily'])
dict_values([8, 10, 9])
9
18
9
('Tom', 10)
{'Jerry': 8}
{'A': 9, 'B': 9, 'C': 9, 'D': 9, 'E': 9, 'F': 9}
{'Jerry': 8}
{'A': 9, 'B': 9, 'C': 9, 'D': 9, 'E': 9, 'F': 9, 'Jerry': 8}
{'Jerry': 8}
{'Jerry': 8, 'Lily': 10}

例 3.13 二维列表中存放有若干名学生的基本信息,每个学生的信息包括:姓名、性别和年龄,将男生和女生的人数存入字典并保存。

StuInfo = [["王硕", "男", 18], ["李梅", "女", 21], ["赵翔", "男", 20], ["王楠", "女", 19], [
    "张力", "男", 20], ["陈昊", "男", 18], ["丁宁", "女", 19], ["王飞", "男", 20]]
StuDict = {}
for item in StuInfo:
    sex = item[1]
    StuDict[sex] = StuDict.get(sex, 0)+1
print("统计结果为:")
for key, value in StuDict.items():
    print(key, value, "人")

运行结果:
统计结果为:
男 5 人
女 3 人

知识点:

  1. get()方法:

    字典名.get(键[,默认值])

  2. 字典常用方法

巩固与拓展

  1. 使用字典来管理一个系统所有的账户密码
dict = {"username": "xiaoqiyan", "password": 123456}
username = input("请输入用户名:")
password = int(input("请输入密码:"))
if username == dict["username"]:
    if password == dict["password"]:
        print("用户名,密码正确!")

运行结果:
请输入用户名:xiaoqiyan
请输入密码:123456
用户名,密码正确!

3.5 应用实例

设计一个通讯录管理系统,包括信息的添加、删除和查找等功能。通讯录中每个人的信息如表 3-4 所示。程序运行后,会在屏幕上显示功能列表,按编号选择相应的功能,执行完一项功能后,会继续显示功能列表,可以选择相应的功能继续执行,直到输入编号 0,结束整个程序。功能列表如下所示:

  1. 退出
  2. 添加信息
  3. 删除信息
  4. 查找信息
  5. 统计人数
  6. 显示信息
姓名 电话 工作地点
张三 北京 13812345678
李四 上海 18512345678
王五 广州 13912345678
import sys
flag = 1
data = []
while(1):
    print("***************")
    print("   1、添加信息")
    print("   2、删除信息")
    print("   3、查找信息")
    print("   4、统计人数")
    print("   5、显示信息")
    print("   0、退出")
    print("***************")
    ch = int(input("请输入功能编号:"))
    if ch == 0:
        sys.exit(0)
    elif ch == 1:
        person = []
        info = input("请输入姓名,电话,工作地点(中文逗号分隔)")
        person = info.strip(" ").split(",")
        data.append(person)
    elif ch == 2:
        flag = 0
        if(len(data) == 0):
            print("通讯录为空!")
        else:
            name = input("请输入要删除的姓名:").strip(" ")
            for line in data:
                if(line[0] == name):
                    flag = 1
                    data.remove(line)
                    break
            if(flag == 0):
                print("没有找到{}的信息".format(name))
    elif ch == 3:
        flag = 0
        if(len(data) == 0):
            print("通讯录为空!")
        else:
            name = input("请输入要查找的姓名:").strip(" ")
            for line in data:
                if(line[0] == name):
                    flag = 1
                    print("查询结果为:")
                    print(line[0], line[1], line[2])
                    break
            if(flag == 0):
                print("没有找到{}的信息".format(name))
    elif ch == 4:
        if(len(data) > 0):
            p_dict = {}
            for line in data:
                p_dict[line[2]] = p_dict.get(line[2], 0)+1
            print("统计结果为:")
            for key, value in p_dict.items():
                print(key, value, "人")
        else:
            print("通讯录为空!")
    elif ch == 5:
        if len(data) > 0:
            for line in data:
                for item in line:
                    print(item, end=' ')
                print("\n")
        else:
            print("通讯录为空!")
    else:
        print("您输入的编号错误!!!")


标题:Python
作者:肖祺彦
地址:url

评论
取消