Python学习日志
RBHGO的主页欢迎关注
温馨提示:创作不易,如有转载,注明出处,感谢配合~
目录
第04课:Python的容器型数据类型
相信通过03课中对分支结构和循环结构的学习,大家都想着能够用它们来做一些应用,在此给大家两个比较经典的例题来巩固一下学习的成果,对于我们这些新手来说的做一些编程练习肯定是巩固我们的学习成果的不二选择。第一个经典例题,我们会在while 循环结构里嵌套if 分支结构,如果你能独立写出这个程序,那么相信自己,你对分支、循环结构已经初步掌握了。因为通常来说我们编写程序就只有顺序结构、分支(选择)结构、循环结构,只要我们接下来通过时间的沉淀,和后续的学习以及应用,就能把它们得心应手的实现在各种应用中。
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:
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)
list2 = list(range(1, 25))
print(list2)
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)
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))
print(items.count('waxberry'))
print(items.count('orange'))
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_METHOD 和POP_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)
for i, area in enumerate(areas):
print(i, area)
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])
print(list2[1])
print(list3[-4])
(6).合并(拼接)和比较
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))
print(random.sample(heroes, k=3))
print(random.choices(heroes, k=3))
print(random.choice(heroes))
random.shuffle(heroes)
print(heroes)
(8).元素翻转和排序
items = ['banana', 'orange', 'peach', 'waxberry', 'strawberry', 'pitaya']
'''第一种'''
print(items[::-1])
'''第二种'''
items.reverse()
print(items)
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)
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
for i, value in enumerate(counter):
print(f'{i + 2}点掷出了{value}次')
这一次我们用了短短8行代码就运行出了掷两次骰子的点数计数问题。这段代码和上面的代码看起来简直就是天差地别,我们甚至没有在循环结构里嵌套哪怕一层分支结构就实现了掷色子问题的升级版, 这就是容器型数据类型带给我们写代码的便利。
再给两个练习题
第一个题叫幸运的女人,关键就在于我们如何把第九人去掉后再将列表合起来。(或者我们可以通过再列表中元素类型定义为布尔值 ,将丢下的男人都循环成False。这也是一种思路,大家可以自己看看喜欢哪一种)
men = []
people = [i for i in range(1, 31)]
for _ in range(15):
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() (先考虑一下再看看我写的是否和你想法一致)
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):
temp = random.randrange(1, 100)
nums.append(temp)
print(nums)
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中的列表底层是一个可以动态扩容的数组,列表元素在内存中也是连续存储的,所以可以实现随机访问(通过一个有效的索引获取到对应的元素且操作时间与列表元素个数无关)。
感谢学习陪伴,您的点赞,评论就是我更新的动力
|