列表的切片操作

列表的切片操作

创建列表的方式

  • 创建列表的方式一:字面量语法
    list1 = [‘apple’, ‘orange’, ‘pitaya’, ‘durian’]
    print(list1)

  • 创建列表的方式二:构造器语法
    list2 = list(range(1, 10))
    print(list2)

  • 创建列表的方式三:生成式(推导式)语法
    list3 = [i for i in range(1, 10)]
    print(list3)

索引和切片

  • 正向索引:0 ~ N - 1 / 负向索引:-N ~ -1

print(list4[2:4])
print(list4[-3:-1])

  • 切片操作格式:

nums[start​:end:​step]

start:切片的开始位置,包括该位置。如:nums[start:]从该位置获取到len(nums)

end:切片的截止位置,不包括该位置。

step:步长

"""
example01 - 列表的切片操作

Author: Asus
Date: 2021/7/26
"""
import random

nums = [random.randrange(100) for _ in range(10)]

print(nums)
print(nums[2:])
print(nums[:])
print(nums[::-1])
print(nums[1:3])   # 左闭右开
print(nums[2:7:2])
print(nums[10:15]) # 超出索引不会报错

列表相关的运算

# 重复运算
list4 = [1, 10, 100] * 5
print(list4)

# 成员运算 --->in / not in ---> True / False
print(10 in list4)
print(5 not in list4)

# 合并
list5 = [1, 3, 5, 7]
list6 = [4, 4, 8]
list6.extend(list5)
# list6 += list5
print(list5)

# 比较
list7 = [1, 3, 5, 7]
list8 = [1, 3, 4, 8, 9]
print(list5 == list7)
print(list7 != list8)
# 比较两个列表对应元素的大小,
print(list7 < list8)

列表的内置函数

"""
example03 - 列表的相关操作

Author: Asus
Date: 2021/7/26
"""

ks = ['banana', 'grape', 'apple', 'waxberry', 'pitaya', 'apple']
if 'strawberry' in ks:
    print(ks.index('strawberry'))
if 'apple' in ks:
    print(ks.index('apple'))
if 'apple' in ks:
    print(ks.index('apple', 1))

append():在列表最后添加元素

insert():在列表指定位置插入元素

ks = ['banana', 'grape', 'apple', 'waxberry', 'pitaya', 'apple']
# 添加元素
ks.append('blueberry')
ks.insert(1, 'watermelon')
print(ks)

pop():默认删除最后一个元素

remove():删除指定的元素

ks = ['banana', 'grape', 'apple', 'waxberry', 'pitaya', 'apple']
# 删除元素
ks.pop()
ks.pop(4)
# del ks[0]
while 'apple' in ks:
    ks.remove('apple')
print(ks)

clear():清空列表元素

ks = ['banana', 'grape', 'apple', 'waxberry', 'pitaya', 'apple']
ks.clear()
print(ks)

统计元素在列表中出现的次数 —> count()

ks = ['banana', 'grape', 'apple', 'waxberry', 'pitaya', 'apple']
print(ks.count('apple'))

附加:显示所有的汉字

"""
example04 - 显示所有的汉字
汉字的编码范围:0x4e00 ~ 0x9fa5

ord() ---> 查看字符对应的编码
chr() ---> 将编码处理成对应的字符
Author: Asus
Date: 2021/7/26
"""
# 显示所有的汉字
for i in range(0x4e00, 0x9fa6):
    print(chr(i), end=' ')

ord() —> 查看字符对应的编码
chr() —> 将编码处理成对应的字符

print(ord('b')) # 查看字母的位置
print(ord('z'))
print('banana' < 'zoo') # 比较元素中字母的位置

print(ord('李'))
print(ord('王'))
print('李四' < '王五')

# 类型不一样的列表不能比大小,除非第一个元素就可以得出结果
items1 = ['apple', 'orange', 'pitaya', 'durian']
items2 = ['yes', 5, 6, 8, 9]
print(items1 < items2)

列表的排序

  • sort():默认为升序,可以修改reverse参数控制升序和降序
  • reverse():对列表的元素进行反转
"""
example05 - 排序

Author: Asus
Date: 2021/7/26
"""

items = ['banana', 'grape', 'apple', 'waxberry', 'pitaya', 'apple']
# items = items[::-1] # 进行反转
items.reverse() # 进行反转
print(items)

# 可以修改reverse参数控制升序或降序
items.sort(reverse=False)    # 默认升序
print(items)

nums = ['1', '10', '234', '2', '35', '100']
nums.sort(key=int)	# 以int类型输出
print(nums)

选择排序

  • 确定最小值min_value
  • 寻找是否有满足比min_value更小的数,如果有就和min_value对换位置
  • 重复以上两步,直到输出满足条件的列表
"""
example06 - 排序(前提:没有sort函数)

Author: Asus
Date: 2021/7/26
"""
# 简单选择排序
nums = [35, 12, 99, 58, 67, 42, 49, 31, 73]

for i in range(len(nums) - 1):
    # 假设第一个元素就是最小值
    min_value, min_index = nums[i], i

    # 通过循环寻找有没有更小的值并记下它的位置
    for j in range(i + 1, len(nums)):
        if nums[j] < min_value:
            min_value, min_index = nums[j], j

    # 将最小的值换到最前面的位置
    nums[i], nums[min_index] = nums[min_index], nums[i]
print(nums)

冒泡排序

冒泡排序对n个数据操作n-1轮,每轮找出一个最大(小)值。
操作只对相邻两个数比较与交换,每轮会将一个最值交换到数据列首(尾),像冒泡一样。

  1. 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
  3. 针对所有的元素重复以上的步骤,除了最后一个;
  4. 重复步骤1~3,直到排序完成。
#nums = [35, 12, 99, 58, 67, 42, 49, 31, 73]
nums = [9, 1, 2, 3, 4, 5, 6, 7, 8]

for i in range(1, len(nums)):
    swapped = False # 标记为未发生交换
    for j in range(0, len(nums) - i):
        if nums[j] > nums[j + 1]:
            nums[j], nums[j + 1] = nums[j + 1], nums[j]
            swapped = True
    if not swapped:
        break

print(nums)

随机抽取和乱序

  • sample函数可以对列表元素进行无放回抽样
  • choices函数可以对列表元素进行有放回抽样
  • choice函数可以从列表中随机选择一个元素
  • shuffle函数可以对列表进行乱序
"""
example08 - 随机抽取和乱序

Author: Asus
Date: 2021/7/26
"""
import random
nums = ['张三', '李四', '王五', '后裔', '狄仁杰', '李元芳']

# sample函数可以对列表元素进行无放回抽样
print(random.sample(nums, 2))

# choices函数可以对列表元素进行有放回抽样
print(random.choices(nums, k=5))

# choice函数可以从列表中随机选择一个元素
print(random.choice(nums))

# 进行乱序
random.shuffle(nums)
print(nums)

实例

  1. 输入三个整数,按照从大到小的顺序输出
"""
homework01 - 1. 输入三个整数,按照从大到小的顺序输出

Author: Asus
Date: 2021/7/24
"""

nums = []
for _ in range(3):
    num = int(input('输入数据:'))
    nums.append(num)

    for i in range(1, len(nums)):
        for j in range(len(nums) - i):
            if nums[j] < nums[j + 1]:
                nums[j], nums[j + 1] = nums[j + 1], nums[j]
print(nums)
  1. 向列表中添加10个随机整数,找出其中第2大的元素

附加:列表的生成式(推导式)—> 写法简明,效率更高
nums = [random.randrange(1, 100) for _ in range(10)]

"""
homework02 - 2. 向列表中添加10个随机整数,找出其中第2大的元素

[a, b) --->random.random() * (b - a) + a

Author: Asus
Date: 2021/7/24
"""
import random
# nums = []
# for _ in range(10):
#     num = random.randrange(1, 100)     # 产生随机小数random.random()
#     nums.append(num)

# 列表的生成式(推导式)---> 写法简明,效率更高
nums = [random.randrange(1, 100) for _ in range(10)]

# 推导式:产生1到100以内的奇数
# nums = [i for i in range(1, 101, 2)]
print(nums)

f_max_value, s_max_value = nums[0], nums[1]     # 假设最大值与第二大值
if f_max_value < s_max_value:
    f_max_value, s_max_value = s_max_value, f_max_value
for i in range(2, len(nums)):
    if nums[i] > f_max_value:
        f_max_value, s_max_value = nums[i], f_max_value
    elif nums[i] == f_max_value:
        pass
    elif nums[i] > s_max_value:
        s_max_value = nums[i]
print(s_max_value)

​ 3.幸运的女人

"""
example09 - 幸运的女人

有15个男人和15个女人坐船出海,船坏了,需要把其中15个人扔到海里,其他人才能活下来;
所有人围成一圈,有某个人从1开始依次报数,报到9的人被扔到海里,下一个人重新从1开始报数,
直到将15个人扔到海里。最后,15个女人都幸存了下来,15个男人都被扔到了海里。
问原先哪些位置是男人,哪些位置是女人。

Author: Asus
Date: 2021/7/26
"""

persons = [i for i in range(1, 31)]
for _ in range(15):
    persons = persons[9:] + persons[:8]
    print(persons)  # 输出去掉的元素后,剩下的元素
for i in range(1, 31):
    print('女' if i in persons else '男', end=' ')

相比于上面代码更加通俗易懂,但是上面的代码更加简洁,可读性高

每一次数到9时,就把这个位置给去掉,然后又从1开始数,直到去掉15个位置。

persons = [True] * 30
index, counter, number = 0, 0, 0
while counter < 15:
    if persons[index]:
        number += 1
        if number == 9:
            persons[index] = False
            counter += 1
            number = 0
    index += 1
    if index == 30:
        index = 0
for person in persons:
    # 三元条件运算 ---> if后面的表达式为True,则取if前面的值,否则取else后面的值
    print('女' if person else '男', end=' ')

4.用一个列表保存54张扑克牌,洗牌,按斗地主的发牌方式把牌发给三个玩家,
多的3张牌给第一个玩家(地主),把每个玩家手上的牌显示出来

先将后面的三个元素提取后,去掉这3个元素,然后再利用切片给每一位玩家赋值

"""
homework05 - 用一个列表保存54张扑克牌,洗牌,按斗地主的发牌方式把牌发给三个玩家,
             多的3张牌给第一个玩家(地主),把每个玩家手上的牌显示出来


Author: Asus
Date: 2021/7/26
"""
import random

nums = []

for i in range(1, 14):
    nums.append('方块' + str(i))
    nums.append('梅花' + str(i))
    nums.append('黑桃' + str(i))
    nums.append('红心' + str(i))
# print(nums)

fs = ['大王', '小王']
pokers = nums + fs

random.shuffle(pokers)
print(len(pokers))
print(pokers)

player1 = []
player2 = []
player3 = []

nums = pokers[-1:-4:-1]
# print(nums)
for i in nums:
    if i in pokers:
        pokers.remove(i)

# print(pokers)

player1 = pokers[0:52:3]
player2 = pokers[1:52:3]
player3 = pokers[2:52:3]

player1 += nums

print(player1)
print(player2)
print(player3)

另一种想法:

import random

suites = ['黑桃', '红心', '梅花', '方块']
faces = ['A', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
# 列表生成式(推导式)
cards = [f'{suite}{face}' for suite in suites for face in faces]
cards.append('小王')
cards.append('大王')

random.shuffle(cards)

# player1 = []
# player2 = []
# player3 = []
# 嵌套列表
# players = [[], [], []]
players = [[] for _ in range(3)]

for _ in range(17):
    for player in players:
        player.append(cards.pop())

players[0].extend(cards)    # 最后三张牌给第一个玩家

for player in players:
    player.sort(key=lambda x: x[1:])
    for card in players:
        print(card, end=' ')
    print()

​ 5.保存5个学生,3门课程的成绩

"""
example01 - 保存5个学生,3门课程的成绩

Author: Asus
Date: 2021/7/27
"""
import random
names = ['李白', '诸葛亮', '墨子', '孙悟空', '赵云']
courses = ['语文', '数学', '英语']
scores = [[random.randrange(50, 101) for _ in range(len(courses))] for _ in range(len(names)) ]

for i, name in enumerate(names):
    for j, course in enumerate(courses):
        print(f'{name}{course}成绩:{score[i][j]}')
# 统计每个学生的平均成绩
for i, name in enumerate(names):
    print(f'{name}的平均成绩:{sum(score[i]) / 3:.lf}')
# 统计每门课的最高分和最低分
for j, course in enumerate(courses):
    temp = [scores[i][j] for i in range(len(names))]
    
    # temp = [scores[i][0] for i in range(len(names))]
	# temp = [scores[i][1] for i in range(len(names))]
	# temp = [scores[i][2] for i in range(len(names))]
    
    print(f'{course}的最高分:{max(temp)}')
    print(f'{course}的最低分:{min(temp)}')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值