IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python学习日志04 - 列表 -> 正文阅读

[Python知识库]Python学习日志04 - 列表

Python学习日志

RBHGO的主页欢迎关注

温馨提示:创作不易,如有转载,注明出处,感谢配合~

目录

第04课:Python的容器型数据类型

相信通过03课中对分支结构和循环结构的学习,大家都想着能够用它们来做一些应用,在此给大家两个比较经典的例题来巩固一下学习的成果,对于我们这些新手来说的做一些编程练习肯定是巩固我们的学习成果的不二选择。第一个经典例题,我们会在while循环结构里嵌套if分支结构,如果你能独立写出这个程序,那么相信自己,你对分支、循环结构已经初步掌握了。因为通常来说我们编写程序就只有顺序结构分支(选择)结构循环结构,只要我们接下来通过时间的沉淀,和后续的学习以及应用,就能把它们得心应手的实现在各种应用中。

# 计算机产生一个1-100的随机数,人输入自己猜的数字
# 计算机给出提示"大一点"、"小一点"或者"恭喜你猜对了",直到猜中为止。
# 如果猜的此数超过7次,温馨提示"您的智商余额不足"

import random
counter = 0
answer = random.randrange(1, 101)
while True:
    counter += 1
    user_answer = int(input('请输入您猜的数字: '))
    if user_answer < answer:
        print('大一点')
    elif user_answer > answer:
        print('小一点')
    else:
        print('恭喜你答对了')
        break
if counter > 7:
    print('温馨提示您的智商余额不足')

如果现在只通过分支、循环语句要求我们写“将一颗骰子掷60000次,统计每一面出现的次数。”这个程序,相信我们应该会大同小异的写出如下程序:

import random
counter1 = 0
counter2 = 0
counter3 = 0
counter4 = 0
counter5 = 0
counter6 = 0
for _ in range(60000):
    anwser = random.randrange(1, 7)
    if anwser == 1:
        counter1 += 1
    elif anwser == 2:
        counter2 += 1
    elif anwser == 3:
        counter3 += 1
    elif anwser == 4:
        counter4 += 1
    elif anwser == 5:
        counter5 += 1
    else:
        # anwser == 6
        counter6 += 1
print(f'骰子掷出1共{counter1}次')
print(f'骰子掷出2共{counter2}次')
print(f'骰子掷出3共{counter3}次')
print(f'骰子掷出4共{counter4}次')
print(f'骰子掷出5共{counter5}次')
print(f'骰子掷出6共{counter6}次')

说句不好听的大实话,这种程序属实是有点恶心的,掷一个骰子我们还可以写出来,要是掷2个,10个,100个,那得打多少无意义的重复代码呢。我们这时应该想到,python中肯定有解决办法来让我跳出这种没有意义的重复过程,还我们一个舒适的编程过程。

进入今天的正题

就是题目中写道的Python的容器型数据类型,当我们明白容器型数据类型应该如何使用时,上面的问题自然能够迎刃而解。容器型数据类型(就是用一个变量可以保存多个数据),然后我们只用对这个容器进行循环操作,重复的问题就会有计算机帮我们解决。

容器型数据类型

容器型数据类型包括1.list (列表)2.tuple(元组)3.set (集合)以及4.dict (字典)

1.列表

在Python中,列表是由一系元素按特定顺序构成的数据序列,这样就意味着定义一个列表类型的变量,可以保存多个数据,而且允许有重复的数据。跟上一课我们讲到的字符串类型一样,列表也是一种结构化的、非标量类型,操作一个列表类型的变量,除了可以使用运算符还可以使用它的方法。

在Python中,可以使用[]字面量语法来定义列表,列表中的多个元素用逗号进行分隔,代码如下所示。

(1).创建列表
# 创建列表的方法一: 字面量语法
list1 = [4, 13, 49, 568, 123, 108]
print(list1)
# 创建列表的方法二: 构造器语法  list() ---> 构造器函数
list2 = list(range(1, 25))
print(list2)
# 创建列表的方法三: 生成式(推导式)语法
# 1 - 20的平方
list3 = [i ** 2 for i in range(1, 21)]
print(list3)
heroes = [
      '稻草人-费得提克', '冰晶凤凰-艾尼维亚','铸星龙王-奥瑞利安', 
'深海泰坦-诺提勒斯', '发条魔灵-奥丽安娜'
]
areas = [ '艾欧尼亚', '裁决之地', '巨神峰', '诺克萨斯', '黑色玫瑰', '战争学院']

nums = [1, 1.25, True, 'hello world', 1 < 2]

温馨提示:列表中字符串str、布尔值bool、整数int、浮点数float都可以放;并且可以同时放。虽然可以这样做但是不推荐这样做,同一个列表里面最好还是统一类型

上面的比较简单,主要是想给大家介绍列表的生成式语法(推到式语法),作为一个根正苗红的python程序员一定要会这种语法。不仅是python设置了这种做法, 就得使用它,而是因为生成式语法‘’简单明确、效率更高‘’,也就是上面创建列表方法中的创建列表的方法三

# 创建一个由1到9的数字构成的列表
items1 = [x for x in range(1, 10)]
print(items1)    # 运行结果是 [1, 2, 3, 4, 5, 6, 7, 8, 9]

# 创建一个由'hello world'中除空格和元音字母外的字符构成的列表
items2 = [x for x in 'hello world' if x not in ' aeiou']
print(items2)    # 运行结果是 ['h', 'l', 'l', 'w', 'r', 'l', 'd']

# 创建一个由个两个字符串中字符的笛卡尔积构成的列表
items3 = [x + y for x in 'ABC' for y in '12']
print(items3)    # 运行结果是 ['A1', 'A2', 'B1', 'B2', 'C1', 'C2']
(2).列表的常用操作

首先我们先来介绍列表,一下是列表的一些常用操作(下面list表示你所命名的列表名)

常用操作作用
list.count()统计某个元素在列表中出现的次数
list.insert()在指定位置加元素
list.pop()删除元素(默认删除列表中的最后一位)
list.append()在末尾加元素
list.remove()从列表中删除指定元素
list.reverse()列表反向排序(从大到小)
list.sort()列表正向排序(从小到大)
list.index()查找元素在列表中的索引(下标)
list.extend()列表中添加(加入)列表
函数名作用
len(list)计算长度的函数(列表元素个数)
max(list)取列表中元素最大值
min(list)取列表中元素最小值
sum(list)列表元素求和
enumerate(list)对列表进行预处理

在下面我们会对这些操作进!行举例应用(温馨提示:请不要偷懒,一定要自己试一试)。

我还是使用上面的列表,没有再次创建。

(3).添加和删除元素
print(heroes)

# 追加元素(在末尾加元素)
heroes.append(10000)
# 插入元素(在指定位置加元素)
heroes.insert(0, 1)
print(heroes)

# 删除元素(默认删除最后一位)
areas.pop()
print(areas)

温馨提示:注意我上面所有列表的命名 1.如果我们的列表里有很多个元素,在进行变量命名的时候一般建议使用单词的复数形势,这样进行循环时的变量名就可以命名为列表命名的单数形式,更重要是的是,方便看懂代码。

2.用不到的for in循环变量python使用者们一般用下划线命名变量(这两点都是为了装高手

# 添加元素
items = ['banana', 'orange', 'peach', 'waxberry', 'strawberry', 'pitaya']
items.append('blueberry')
items.insert(1, 'watermelon')
print(items)

# index() ---> 查找元素在列表中的索引(下标)
if 'strawberry' in items:
    print(items.index('strawberry'))
if 'peach' in items:
    print(items.index('peach'))
if 'peach' in items[3:]:
    print(items.index('peach', 3))

# count() ---> 统计元素在列表中出现的次数
print(items.count('waxberry'))
print(items.count('orange'))

# 删除元素(pop()、 remove()、 del这个不推荐使用)
items.pop()
temp = print(items.pop(2))
print(temp)
print(items)

del items[0]
print(items)

items.remove('pitaya')
print(items)


# 清空列表
items.clear()
print(items)

温馨提示:Python中的del关键字后面跟要删除的元素,这种做法跟使用pop方法指定索引删除元素没有实质性的区别,但后者会返回删除的元素,前者在性能上略优(del对应字节码指令是DELETE_SUBSCR,而pop对应的字节码指令是CALL_METHODPOP_TOP)。

(4).列表的遍历

列表的遍历就是把每个元素依次从列表中取出来,接着上面以及做好的列表我们继续来讲

# 可以对列表进行读写操作
for i in range(len(heroes)):
    print(heroes[i])
    # 全部变为击剑模式
    heroes[i] = '无双剑姬-菲奥娜'
print(heroes)


#只是华丽的分割线,没什么其他意思,下同
print('---' * 49)


# 这种方法只能进行读操作,不能对列表进行写操作
for area in (areas):
    print(area)
    area = 0
print(areas)


print('---' * 49)


# 先通过enumerate函数对列表进行预处理
# 循环遍历的时候既可以得到索引(下标)又可以获得到元素
for i, area in enumerate(areas):
    print(i, area)
# 获取列表元素的个数 len()--->length
print(len(list1))

# 遍历列表中的元素(上面用的是字符串,我们也可以试一下整数型)
list1 = [1, 12, 58, 546]
list2 = list(range(1, 25))

for i in range(len(list2)):
    print(list2[i])

for x in list1:
    print(x)

for i, x in enumerate(list3):
    print(i + 1, x)

温馨提示:如果你运行了程序,你会明显的看到第一种和第二种的区别,第一种我们能够将列表里的元素都赋值改变,而下面一种更好看更易读但是却不能对列表进行改变。

(5).列表索引和切片
# 索引和切片
import random

nums = [random.randrange(1, 101) for _ in range(15)]
# 第三个数开始切到结束
print(nums[2:])
# 全部切片
print(nums[:])
# 切完,但是倒着切,输出的列表元素顺序倒转
print(nums[::-1])
# 切出列表中第二个数到第三个数
print(nums[1:3])
# 切出第三个到第七个,每隔一个取一个
print(nums[2:7:2])
# 不会报错,为空
print(nums[15:1])

# 正向索引: 0 - N-1 / 负向索引: -N - -1
print(list2[1])
print(list3[-4])


(6).合并(拼接)和比较
# 合并 通过列表间用 + 号 或者使用list5.extend(list6)
list5 = [1, 2]
list6 = [3, 4]
list5 += list6
print(list5)

# 比较  ---> 实际应用几乎没有,但是知识结构应该构建
list7 = list(range(1, 8, 2))
list8 = [5, 7, 9]
# 比较两个列表的元素是否意义对应相等
print(list7 == list5)
# 比较两个列表对应元素的大小(无论列表中有多少元素,只要分出一次胜负,后面就不比了)
print(list7 > list8)
(7).列表的随机抽取和乱序
import random

heroes = [
    '稻草人-费得提克', '冰晶凤凰-艾尼维亚','铸星龙王-奥瑞利安',
    '深海泰坦-诺提勒斯', '发条魔灵-奥丽安娜'
]

print(len(heroes))
# sample函数可以对列表元素做单次无放回抽样
print(random.sample(heroes, k=3))
# choices函数可以对列表元素进行有放回抽样(可以重复抽中)
print(random.choices(heroes, k=3))
# choice函数可以从列表中随机选择一个元素
print(random.choice(heroes))
# shuffle函数可以实现列表元素的随机乱序
random.shuffle(heroes)
print(heroes)
(8).元素翻转和排序
# 反转
items = ['banana', 'orange', 'peach', 'waxberry', 'strawberry', 'pitaya']

'''第一种'''
print(items[::-1])

'''第二种'''
items.reverse()
print(items)


# 排序(可以修改reverse参数控制排升序还是降序)

list1 = [21, 65, 89, 3333, 5, 12]
items.sort()
print(items)
list1.sort(reverse=True)
print(list1)

# 如何将字符串数字转化为整数(很重要)
nums = ['1', '38', '2', '400', '568', '123']
'''方法一'''
nums.sort()
print(nums)
nums2 = [int(num) for num in nums]
nums2.sort()
print(nums2)
nums3 = [str(nums) for num in nums2]
print(nums3)
'''方法2(高级)'''
nums.sort(key=int)   # key在列表中表数据类型的意思,这里就是令数据类型为整数型
print(nums)

温馨提示:在列表中元素数据类型的转换比较重要,是常常应用于日常生活中的工作性问题的。

再练习

当我们学习了Python的第一种容器型数据类型list后,现在我们再来试着做一下上面那个掷色子的问题,这次我们直接掷两个骰子,看一看2-12点出现的次数

# 掷两个骰子通过列表记录每一个点数出现的次数
counter = [0] * 11
for _ in range(60000):
    anwser1 = random.randrange(1, 7)
    anwser2 = random.randrange(1, 7)
    anwser3 = anwser1 + anwser2
    counter[anwser3 - 2] += 1
# print(counter)
for i, value in enumerate(counter):
    print(f'{i + 2}点掷出了{value}次')

这一次我们用了短短8行代码就运行出了掷两次骰子的点数计数问题。这段代码和上面的代码看起来简直就是天差地别,我们甚至没有在循环结构里嵌套哪怕一层分支结构就实现了掷色子问题的升级版, 这就是容器型数据类型带给我们写代码的便利。

再给两个练习题

第一个题叫幸运的女人,关键就在于我们如何把第九人去掉后再将列表合起来。(或者我们可以通过再列表中元素类型定义为布尔值,将丢下的男人都循环成False。这也是一种思路,大家可以自己看看喜欢哪一种)

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

men = []
people = [i for i in range(1, 31)]
for _ in range(15):
    # 将除了站地九个位置的其他人合并,把前面(前8人)的人通过合并的方式放到最后面
    people = people[9:] + people[:8]
    # 将丢到的男人们,添加到自己的列表里
    men.append(people[9])
for i in range(1, 31):
    print('女' if i in people else '男', end=' ')
# 为了输出好看,给位置排个序
people.sort()
print(f'活下来的分别是在站{people}位置的女人')
men.sort()
print(f'被扔下大海的分别是站在{men}位置的男人')

第二题 向列表中添加10个随机整数,找出其中第2大的元素。我这个代码用了列表的自动排序,看起来比较简单,但是如果我们限制不能使用list.sort()(先考虑一下再看看我写的是否和你想法一致)

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

import random

temps = []
for _ in range(10):
    x = random.randrange(1, 100)
    temps.append(x)
temps.sort()
print(temps)
if temps[-1] == temps[-2]:
    print(f'第二大元素是{temps[-3]}')
else:
    print(f'第二大元素是{temps[-2]}')
import random

nums = []
for _ in range(10):
    # random.random() 取的是随机浮点数; random.randrange() 取随机整数
    temp = random.randrange(1, 100)
    nums.append(temp)
print(nums)
# Python中的独特赋值方法,多个赋值同步执行
m1, m2 = nums[0], nums[1]
if m1 < m2:
    m1, m2 = m2, m1
# 首先确立前两个数的排序后,我们的范围就可以变成第三个开始到倒数第二个数(最后一次循环不影响结果,所以可写可不写)
for i in range(2, len(nums) - 1):
    if nums[i] > m1:
        m1, m2 = nums[i], m1
    # 设置条件,避免出现相等的最大数,我这里认为有两个最大数,那么第三大数为我们要取的第二大数。
    elif nums[i] > m2 and nums[i] != m1:
        m2 = nums[i]
print(f'列表中的第二大元素是{m2}')

嵌套的列表

正如我在创建列表的温馨提示中说到的,Python语言没有限定列表中的元素必须是相同的数据类型,也就是说一个列表中的元素可以任意的数据类型,当然也包括列表。如果列表中的元素又是列表,那么我们可以称之为嵌套的列表。嵌套的列表可以用来表示表格或数学上的矩阵。(这部分后面再补充)

总结

通过这堂课内容比较丰富的学习,心里得明白列表是容器,可以保存各种类型的数据可以通过索引操作列表元素这是当前的首要,当然能够加以应用是最好;多多练习,消化吧!

温馨提示:Python中的列表底层是一个可以动态扩容的数组,列表元素在内存中也是连续存储的,所以可以实现随机访问(通过一个有效的索引获取到对应的元素且操作时间与列表元素个数无关)。

感谢学习陪伴,您的点赞,评论就是我更新的动力

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-07-27 16:10:51  更:2021-07-27 16:11:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/7 13:03:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码