Python学习日志

RBHGO的主页欢迎关注

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

目录

文章目录

  • Python学习日志
    • 目录
    • 第04课:Python的容器型数据类型
      • 进入今天的正题
        • 容器型数据类型
      • 1.列表
        • (1).创建列表
        • (2).列表的常用操作
        • (3).添加和删除元素
        • (4).列表的遍历
        • (5).列表索引和切片
        • (6).合并(拼接)和比较
        • (7).列表的随机抽取和乱序
        • (8).元素翻转和排序
        • 再练习
      • 嵌套的列表
      • 总结

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

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

# 计算机产生一个1-100的随机数,人输入自己猜的数字
# 计算机给出提示"大一点"、"小一点"或者"恭喜你猜对了",直到猜中为止。
# 如果猜的此数超过7次,温馨提示"您的智商余额不足"import random
counter = 0
answer = random.randrange(1, 101)
while True:counter += 1user_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 += 1elif anwser == 2:counter2 += 1elif anwser == 3:counter3 += 1elif anwser == 4:counter4 += 1elif anwser == 5:counter5 += 1else:# anwser == 6counter6 += 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 randomnums = [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 randomheroes = ['稻草人-费得提克', '冰晶凤凰-艾尼维亚','铸星龙王-奥瑞利安','深海泰坦-诺提勒斯', '发条魔灵-奥丽安娜'
]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 + anwser2counter[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 randomtemps = []
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 randomnums = []
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)):if nums[i] > m1:m1, m2 = nums[i], m1elif m1 > nums[i] > m2:m2 = nums[i]# 设置条件,避免出现相等的最大数,我这里认为有两个最大数,那么第三大数为我们要取的第二大数。elif nums[i] > m2 and nums[i] == m1:pass
print(f'列表中的第二大元素是{m2}')

嵌套的列表

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

总结

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

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

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

Python学习日志04 - 列表相关推荐

  1. Python学习日志12 - 办公自动化

    Python学习日志 RBHGO的主页欢迎关注 温馨提示:创作不易,如有转载,注明出处,感谢配合~ 目录 文章目录 Python学习日志 目录 前言 进入正题 Python学习日志12课 - 办公自动 ...

  2. Python学习日志08 - 字典

    Python学习日志 RBHGO的主页欢迎关注 温馨提示:创作不易,如有转载,注明出处,感谢配合~ 目录 文章目录 Python学习日志 目录 Python学习日志08课 - 字典 前言 进入正题 创 ...

  3. Python学习日志10 - 高阶函数和高级应用

    Python学习日志 RBHGO的主页欢迎关注 温馨提示:创作不易,如有转载,注明出处,感谢配合~ 目录 文章目录 Python学习日志 目录 前言 进入正题 Python学习日志10课 - 高阶函数 ...

  4. Python学习笔记:列表、字典与集合解析(List, Dict and Set Comprehensions)

    Python学习笔记:列表.字典与集合解析(List, Dict and Set Comprehensions) 1.列表解析 最受喜爱的Python语言特性.过滤一个集合的元素生成一个新的列表. 一 ...

  5. Python学习日志--摆动吧!钟摆!

    Python学习日志–摆动吧!钟摆! 由于读研跟着导师搞人工智能方向,所以开始学习python,在学习到使用到tkinter进行GUI设计这部分的时候,有一道很有意思的编程题:用tkinter动态演示 ...

  6. Python学习日志16 - 数据库SQL查询

    Python学习日志 RBHGO的主页欢迎关注 温馨提示:创作不易,如有转载,注明出处,感谢配合~ 目录 文章目录 Python学习日志 目录 Python学习日志16课 - 数据库SQL查询 DQL ...

  7. python 学习日志(3)旋转角--改进

    python 学习日志(3)旋转角–改进 啊!都看网上说if -else非常令人头疼,今天终于感受到了: def xuan_zhuan_jiao_qiu_zhi_1_9():print(small * ...

  8. Python学习日志 3.5

    Python学习日志 RBHGO的主页欢迎关注 温馨提示:创作不易,如有转载,注明出处,感谢配合~ 目录 文章目录 Python学习日志 目录 第3.5课:Python分支结构和循环结构的应用 例子1 ...

  9. python观察日志(part24)--列表和numpy数组扁平化

    学习笔记,仅供参考,有错必究 参考文献:python–列表.数组扁平化:你知道如何将python中嵌套的列表扁平化吗? 列表扁平化 方案1 print(sum([[1, 2, 3], ["s ...

最新文章

  1. 怎么用python找论文_如何利用Python绘制学术论文图表方法
  2. python中的函数、生成器的工作原理
  3. mediawiki 搭建
  4. 遗传算法求解装箱问题c语言,求解装箱问题的遗传算法-南昌航空大学期刊网.pdf...
  5. arcgis工具_地理工具学习--arcgis篇(16):标准距离
  6. 为什么阿里巴巴的市值比京东高,世界500排名比京东靠后?
  7. Python中的抽象
  8. hdu 4619 Warm up 2 (二分匹配)
  9. 专业术语常用名词缩写中英文对照
  10. Mac系统镜像文件(Monterey-Sierra,加部分OS X)
  11. android 评论发表情,安卓微信朋友圈怎么评论发表情包 微信朋友圈评论发表情包方法...
  12. 计算机管理员怎么开通,管理员权限怎么设置
  13. JQ ajax 请求事件处理
  14. lighttpd支持AJAX吗,lighttpd配置https
  15. Macbook清理other
  16. 毕业设计基础教学:SPI 通信接口
  17. Java后端实习总结--福州之旅
  18. What?Poly又双叒叕发新品了?
  19. java并发编程 目录_Java并发编程实战的作品目录
  20. 像素 屏幕分辨率 摄像头分辨率

热门文章

  1. OpenCV-Python——第36章:姿势估计
  2. WPF 手动内存释放
  3. JProfiler怎么安装与使用
  4. 用php如何设置页边距_Word2019文档设置页边距的方法
  5. 君子不和牛置气,混蛋让它混到底--“骂”老板(6)
  6. TCGA里面的任意基因做生存分析 批量生存分析
  7. Excel表格中如何找出并替换数据中某一固定范围内的值(包括空值)
  8. 满满的情怀!扎克伯格写给初生女儿的信(全文)
  9. Docker 覆盖Entrypoint的内容
  10. 关于对渣打编程马拉松 2013 的样题的一些想法