嵌套列表,与摩尔投票进阶


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 三个不同的列表。

如下图:
嵌套列表,与摩尔投票进阶_第1张图片

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)

你可能感兴趣的:(python)