Cris 的Python日记(四):Python 数据结构之序列和列表

0. 序

我年少却不有为
不懂得珍贵却自卑

摘自·网易云音乐《年少有为》·热评

1. 简单认识序列和列表

# 序列
# 序列是Python 中最基本的数据结构,用于保存一组有序的数据,所有数据都在序列中拥有一个唯一索引,并且按照元素添加的顺序来指定序列

# 序列的分类
# 1. 可变序列(序列中的元素可以改变):list
# 2. 不可变序列(序列中的元素不可改变):字符串(str);元祖(tuple)
# 列表的切片和通用操作可以用于所有序列类型

# 创建列表,直接通过[]即可创建一个空列表
my_list = []
print(my_list, type(my_list))    # [] <class 'list'>

# 列表中的一个个数据,一般都称为一个个元素
# 可以在创建列表的时候,直接指定元素,和 java 的 ArrayList 很类似
my_list = [1, 2, 3]
print(my_list)  # [1, 2, 3]

# 列表中可以存储任何类型的数据(和 java 严格的数据类型规定不同)
my_list = [1, 'cris', True, None, [123, 321], print]
# [1, 'cris', True, None, [123, 321], <built-in function print>]
print(my_list)

# 类表中的数据插入都是有顺序的,取数据又是根据索引取,和java 的数组一样
print(my_list[0])   # 1

# 可以使用 len()函数获取列表的元素个数
print(len(my_list))  # 6

2. 序列的通用操作

players = ['james', 'curry', 'harden', 'durant', 'rose']

#
# + 和 *
# + 可以将别表拼接,不同列表的元素可以重复
nums = [1, 2, 3] + [3, 4, 5]
print(nums)  # [1, 2, 3, 3, 4, 5]

# * 可以对列表进行复制,类似于字符串
names = ['cris', 'james'] * 2
print(names)    # ['cris', 'james', 'cris', 'james']

# in 和 not in 可以用来检查元素存在/不存在 列表中
print('davis' in players)   # False
print('davis' not in players)   # True

# len()用于获取列表长度

# max 和 min 可以用来最大和最小值,数字比较值,字符串比较 Unicode 编码
print(max(nums))    # 5
print(min(nums))    # 1

# 方法和函数基本一致,但是方法需要通过对象.方法名(参数) 来调用,所以方法其实就是
# 和对象关系紧密的函数

# index(x,[start],[end]) 默认用于获取指定元素 x 第一次出现的索引
print(players.index('harden'))  # 2

# 从索引为3 的元素开始查找指定元素的索引,结束索引为4,如果在这个范围内没有找到,报错
# print(players.index('harden', 3, 4))
# print(players.index('cris'))    # 不存在报错

# count(x) 用于获取指定元素 x 出现的次数
print(players.count('harden'))  # 1
print(players.count('cris'))    # 0

3. 序列的切片(列表为例)

# 列表的切片:从现有列表获取子列表
players = ['james', 'curry', 'harden', 'durant', 'rose']
players1 = players[1:4]  # ['cris', True, None]
print(players1)

# 索引可以是负数,表示倒数向前获取元素,-1 表示倒数第一个,依次类推
players2 = players[-1]
print(players2)

# 如果想要获取列表中的前两个数据:列表中元素的索引都是从0开始,切片范围留头不留尾
print(players[0:2])  # 包括索引为0和1的元素,但是不包括2
print(players)  # ['james', 'curry', 'harden', 'durant', 'rose']

# 切片总会返回新的列表,对原列表没有任何影响,除非对原引用重新赋值
# 如果切片的范围没有结束位置,默认截取到最后一个元素
print(players[0:])  # ['james', 'curry', 'harden', 'durant', 'rose']

# 如果切片的范围没有启示位置,默认从第一个元素开始切片
print(players[:3])  # ['james', 'curry', 'harden']

# 如果开始位置和结束位置都省略,相当于复制了一遍原列表
print(players[:])   # ['james', 'curry', 'harden', 'durant', 'rose']

# 可以加入步长参数,默认为1,这里设置为2,表示每隔两个切一个,步长如果为0,则报错
# 步长如果设置为负数,如-1,则从列表的后面倒着取
print(players[::2])     # ['james', 'harden', 'rose']
print(players[::-1])    # ['rose', 'durant', 'harden', 'curry', 'james']

# 以下这种情况切出来为 [],因为列表的顺序默认从开头往末尾切片(或者理解为从左往右)
print(players[-2:-4])   # []
# 如果想要倒着切片(从右往左),那就需要设置步长为负数了
print(players[-2:-4:-1])    # ['durant', 'harden']
print(players[-4:-2])   # ['curry', 'harden']

4. 列表 API 之修改

players = ['james', 'curry', 'harden', 'durant', 'rose']

# 列表的修改
# 1. 通过索引直接修改
players[0] = 'kobe'
print(players)  # ['kobe', 'curry', 'harden', 'durant', 'rose']

# 2. 通过del 删除元素
del players[1]
print(players)  # ['kobe', 'harden', 'durant', 'rose']

# 3. 通过切片并赋值的形式来修改列表,注意赋值的类型必须是序列,且元素个数不必匹配
players[0:2] = 'str'
print(players)  # ['s', 't', 'r', 'durant', 'rose']
players[0:3] = ['towns', 'jordan', 'lavin']
print(players)  # ['towns', 'jordan', 'lavin', 'durant', 'rose']
# players[0:2] = 123  # 报错

print(players[0:0])  # []
players[0:0] = ['antony']   # 向索引为0 的元素前面插入新的序列
print(players)  # ['antony', 'towns', 'jordan', 'lavin', 'durant', 'rose']

# 设置步长后,替换序列的个数必须和切片的元素个数一致
players[0::2] = [1, 2, 3]
print(players)  # [1, 'towns', 2, 'lavin', 3, 'rose']

# 通过切片删除元素
del players[0:2]
print(players)  # [2, 'lavin', 3, 'rose']
players[1:2] = []
print(players)  # [2, 3, 'rose']

# 通过list()函数将不可变序列转换为可变序列
cris = list('cris')
print(cris)  # ['c', 'r', 'i', 's']
cris = list(123)    # 报错

5. 列表的常见方法

players = ['james', 'curry', 'harden', 'durant', 'rose']

print('原列表', players)    # 原列表 ['james', 'curry', 'harden', 'durant', 'rose']

# append 方法:将元素插入到列表的末尾
players.append('cris')
print(players)  # ['james', 'curry', 'harden', 'durant', 'rose', 'cris']

# insert 方法:向列表的指定位置插入元素
players.insert(1, '思密达')
print(players)  # ['james', '思密达', 'curry', 'harden', 'durant', 'rose', 'cris']

# extend() 使用新的序列扩展当前序列,等同于 +=
players.extend('kobe')
# ['james', '思密达', 'curry', 'harden', 'durant', 'rose', 'cris', 'k', 'o', 'b', 'e']
print(players)
players += (['刘备', '张飞'])
# ['james', '思密达', 'curry', 'harden', 'durant', 'rose', 'cris', 'k', 'o', 'b', 'e', '刘备', '张飞']
print(players)

# clear()
# players.clear()
# print(players)  # []

# pop:根据索引删除并返回元素,不传递索引默认删除最后一个元素并返回该元素
player = players.pop(2)
# ['james', '思密达', 'harden', 'durant', 'rose', 'cris', 'k', 'o', 'b', 'e', '刘备', '张飞']
print(players)
print(player)   # curry

# remove:根据元素的值删除,默认删除第一个匹配的元素
players.remove('rose')
# ['james', '思密达', 'harden', 'durant', 'cris', 'k', 'o', 'b', 'e', '刘备', '张飞']
print(players)

# reverse:反转
players.reverse()
# ['张飞', '刘备', 'e', 'b', 'o', 'k', 'cris', 'durant', 'harden', '思密达', 'james']
print(players)

# sort:对列表中的元素排序,默认升序
nums = list("faoanaonoalg")
nums.sort()
print(nums)  # ['a', 'a', 'a', 'a', 'f', 'g', 'l', 'n', 'n', 'o', 'o', 'o']
nums = [23, 1, 34, 53, 14]
# 如果想要降序排序,传入指定 reverse 参数即可
nums.sort(reverse=True)
print(nums)  # [53, 34, 23, 14, 1]

6. 列表的遍历

# 遍历列表其实就是将列表中的所有元素取出来操作即可
players = ['james', 'curry', 'harden', 'durant', 'rose']

# 通过while 循环来遍历列表
n = 0
while n < len(players):
    print(players[n])
    n += 1

# 通过for 循环来遍历,类似java 的增强for 循环,相比while 循环更加便利
for player in players:
    print(player)

7. 列表case练习:EMS

# EMS (employee manager system)

emps = [[1, 'james', '23', '男', '美国']]
id = 1
while True:
    num = int(input('''====================欢迎使用员工管理系统=============
            1. 查询所有员工
            2. 新增员工
            3. 删除员工
            4. 退出
            请输入(1-4):'''))

    if num == 1:
        print(f'''======================================================
                  序号 姓名 年龄 性别 住址''')
        for emp in emps:
            print(
                f'''\t\t\t\t{emp[0]} {emp[1]} {emp[2]}  {emp[3]}   {emp[4]}''')
    elif num == 2:
        print('-' * 15)
        name = input('请输入员工的名字:')
        age = int(input('请输入员工的年龄:'))
        sex = input('请输入性别(男/女/人妖):')
        address = input('请输入员工的地址:')
        id += 1
        emps.append([id, name, age, sex, address])
    elif num == 3:
        print('=' * 15)
        num = int(input('请输入要删除的员工编号:'))
        for emp in emps:
            # 注意不同数据类型之间的比较(==)是无法进行值比较的,例如'1' 和 1
            if emp[0] == num:
                print('删除员工成功')
                emps.remove(emp)
                break
    elif num == 4:
        input('欢迎使用员工管理系统,点击回车键退出')
        break
    else:
        print('只能选择 1~4')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值