title: “Python fishC 22”
author: “hou wei”
date: “2023-04-16”
output: html_document
knitr::opts_chunk$set(echo = TRUE)
问答题
0.请问 == 运算符和 is 运算符有什么区别呢?
在Python中==运算符用于比较两个变量的值是否相等,而is运算符用于判断两个变量引用对象是否为同一个,即所引用的对象的内存地址是否一致。
1.请问下面代码的执行结果是?
[[1, 2, 3], [4, 5, 6]] + [7, 8, 9]
执行错误结果为[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
,正确结果为[[1, 2, 3], [4, 5, 6], 7, 8, 9]
。
2.请问下面代码的执行结果是?
len([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
执行结果为3,len()函数返回的是列表中元素的个数,而不是列表中所有元素的个数。
3.请问下面代码的结果是返回 True 还是 False 呢?
a = 250
b = 250
a is b
代码返回的是Ture,列表和字符串的存储方式是不同的。如果是列表的话,上面的返回结果就是FALSE。
4.请问下面代码的结果是返回 True 还是 False 呢?
a = 1000
b = 1000
a is b
这串代码的返回结果是FALSE。这是因为Python中,对于小整数和字符串,Python 会缓存这些对象,以便重复使用。在这种情况下,a和b引用的是相同的对象,因此 a isb 返回True。但是,对于大整数和大型字符串等对象,Python不会缓存它们,因此 a 和 b 引用的是不同的对象,a is b 返回 False。出于性能优化方面的考虑,Python 在内部为 -5~256 范围内的整数维护了一个数组,起到缓存的作用。
5.既然有二维列表,那么三维列表应该也是“同理可得”的东西,请大家尝试创建一个简单的三维列表吧?
先可以使用元素值来创建二维列表,还可以使用循环语句来创建二维列表。
matrix = [[1,2,3],[1,2,3],[1,2,3]]
A = [0]*3
for i in range(3):
A[i] = [0]*3
列表推导式的方法如下
dp = [[[0 for i in range(3)] for j in range(3)] for k in range(3)]
dp
列表推导式是Python构建列表的一种快捷方式,可以利用 range 区间、元组、列表、字典和集合等数据类型,快速生成一个满足指定需求的列表。列表推导式的结构是在一个中括号里包含一个表达式,然后是一个for语句,然后是 0 个或多个 for 或者 if 语句。那个表达式可以是任意的,意思是你可以在列表中放入任意类型的对象。返回结果将是一个新的列表,其中包含符合条件的元素。
或者使用嵌套的for循环来创建三维列表
dp = []
for i in range(3):
dp.append([])
for j in range(3):
dp[i].append([0] * 3)
dp
动动手
0. 请根据下面的内存关系图,分别创建出 x、y 和 z 三个不同的列表。
如下图:
x = [[0]*3]*3
y = [0]*3
for i in range(3):
y[i] = [0]*3
z = []
for i in range(3):
z.append([])
for j in range(3):
z[i].append([0] * 2)
x
y
z
1.上一节的课后作业我们提到了“摩尔投票法”,这种方法尤其适用于在任意多的选项中找到数量占比最多的那一个。那么这一次我们修改一下要求,编写代码,利用“摩尔投票法”来找出占比数量最多的两个元素(注意:这两个元素的数量都需要超过总数的三分之一)。
看到题目我第一思路就是先将占比最多的找到,然后将其排除,再找到剩下元素占比最多的即可。
首先是对抗阶段,再是统计比较
nums = [2, 2, 4 , 2, 3, 4, 6, 2, 2]
major = nums[0]
count = 0
for each in nums:
if count == 0:
major = each
if each == major:
count += 1
else:
count -= 1
if nums.count(major)> len(nums)/3:
print("占比最多的第一个元素是:", major)
else:
print("不存在占比最多的元素。")
我们可以思考,如果某个元素再序列里面大于1/3但是小于1/2,上面的代码将无法为我们找出对应正确的元素。所以第一思路也存在一定的问题。
我们带入两个元素进去就不会出现上面的问题啦。
def majorityElement(nums):
candidate1 = nums[0]
candidate2 = nums[0]
count1 = 0
count2 = 0
for num in nums:
if num == candidate1:
count1 += 1
elif num == candidate2:
count2 += 1
elif count1 == 0:
candidate1 = num
count1 = 1
elif count2 == 0:
candidate2 = num
count2 = 1
else:
count1 -= 1
count2 -= 1
return [n for n in (candidate1, candidate2) if nums.count(n) > len(nums) // 3]
nums = [2, 2, 4 , 2, 3, 4, 6, 2, 4]
print("占比最多的两个元素分别是:",candidate1,candidate2)
同时也可以使用continue函数
nums = [1, 1, 2, 1, 3, 2, 3, 2]
major1 = major2 = nums[0]
count1 = count2 = 0
# 对抗阶段
for each in nums:
if major1 == each:
count1 += 1
continue
if major2 == each:
count2 += 1
continue
if count1 == 0:
major1 = each
count1 = 1
continue
if count2 == 0:
major2 = each
count2 = 1
continue
count1 -= 1
count2 -= 1
# 统计阶段
if nums.count(major1) > len(nums) / 3:
print(major1)
if nums.count(major2) > len(nums) / 3:
print(major2)