python 作业20 列表3

问题:

0. 请问如何不直接使用下标索引值的前提下,将下面列表中的 “黑寡妇“ 替换为 ”神奇女侠“?

 

>>> heros = ['蜘蛛侠', '绿巨人', '黑寡妇', '鹰眼', '灭霸', '雷神']
heros[heros.index("黑寡妇")] = "神奇女侠"

列表中并没有一个直接查找某个元素并替换的方法,但我们可以综合利用所学的知识来解决问题。先通过 heros.index("黑寡妇") 获取 “黑寡妇“ 在列表中的索引值,然后通过索引值引用来替换列表中的元素。

如果用列表索引就是

heros[2] = "神奇女侠"

 

1. 请问如何将下面列表中的 “蜘蛛侠” 和 “绿巨人” 替换为 “猪猪侠” 和 “女巨人”?

>>> heros = ['蜘蛛侠', '绿巨人', '神奇女侠', '鹰眼', '灭霸', '雷神']
heros[0] = "猪猪侠"\
heros[1] = "女巨人"



or 用切片方法
heros[0:2] = ["猪猪侠", "女巨人"]7

 

 

2.请问以下代码会打印什么内容?

>>> s = [1, 2, 3, 4, 5]
>>> s[1:2] = [6, 6]
>>> print(s) 

[1, 6, 6, 3, 4, 5]

 

3.请问以下代码会打印什么内容?

>>> s = [1, 2, 3, 4, 5]
>>> s[:] = "FishC"
>>> print(s)

['F', 'i', 's', 'h', 'C']

 

4.请问以下代码会打印什么内容?

>>> s = [1, 2, 3, 4, 5]
>>> s[2:4] = []
>>> print(s)

 [1,2,5]

 

5.请问以下代码会打印什么内容?

>>> s = [1, 2, 3, 4, 5]
>>> t = s
>>> s[2] = 1
>>> print(t)

[1, 2, 1, 4, 5]

6.我们知道,列表的 index() 方法可以找到第一个匹配元素的下标,那么你有没有办法在不改变原列表的情况下,找到最后一个匹配元素的下标呢?(有两种方法可以实现)

两种方法

第一种方法的思路是:通过拷贝获取一个列表的副本(题目要求不改变原列表),然后将该副本原地翻转,再通过 index() 方法获取翻转后指定元素的下标,最后,使用(列表的长度 - 1 - 翻转后的下标)得到最终的结果。

nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 8, 5, 6, 3, 2, 1, 2]
nums_copy = nums.copy()
nums_copy.reverse()
len(nums_copy) - 1 - nums_copy.index(1)
15

 

第二种 就是写一个搜索的代码 直接搜索出来

count = nums.count(1)
length = len(nums)
for each in range(length):
    if nums[each] == 1:
       count -= 1
    if count == 0:
       print(each)
       break

15

 

动动手:

0.如果有一个列表,其中占比超过一半的元素称之为主要元素,那么如何获取一个列表的主要元素呢?

题目给定的列表是:[2, 2, 4, 2, 3, 6, 2]

解题思路:

根据主要元素的定义,对列表进行排序操作之后,主要元素必然会出现在列表长度一半之后的一个位置上。

所以,我们只需要判断列表中是否有超过一半的元素与中间元素相同即可(如果有,中间元素为主要元素;否则,不存在主要元素)

 

 

n = [2, 2, 4, 2, 3, 6, 2]
a = n[:]
a.sort(reverse=False)
if a[len(a)//2-1] == a[len(a)//2]:
    print("该列表主要元素是",a[len(a)//2])
else:
    print("该列表没有主要元素")

第一种是我的方法 按照思路的提示,我们可以看出只要是有主要元素的列表 那么他就必须是超过一半 ,也就意味着我们可以取出列表的中间值来和中间值右一位的数字作比较,不过在此之前 肯定是需要按升序或者降序的顺序排列,所以我就用到了 sort(reverse=False)  如果 =True 的话 那么 这就是降序排列 , 这一步的前提 先要有另一个列表 

可以使用copy指令来复制出另一个列表  这里我就用了a 来复制列表n  然后用升序排列 列表a 再将列表a的元素去中间值  所以我选择用len函数来列出列表元素数量再用//整除2 可以有效规避余叔问题,接着 由于python列表是从0开始计算 那么我们则需要将结果再减去1 才算是中间值 也就是这句len(a)//2-1的意思  然后判断 中间元素和右一位元素的取值是否相等 相等则就是主要元素

 

nums = [2, 2, 4, 2, 3, 6, 2]
    
nums.sort()
length = len(nums)
half = nums[length // 2]
count = 0
    
for each in nums:
    if each == half:
        count += 1
if count > length / 2:
    print("存在主要元素,是:", half)
else:
    print("不存在主要元素!")

 

 1.其实上面这道题有一个经典的解法,就是使用摩尔投票法(Boyer–Moore majority vote)。

摩尔投票法有时候也被称为“多数投票法”,该算法解决的问题是如何在任意多的候选人中(选票无序),找到获得票数最多的那个。

摩尔投票法分为两个阶段:

  • 对抗阶段:分属两个候选人的票数进行两两对抗抵消
  • 计数阶段:计算对抗结果中最后留下的候选人票数是否有效

大家不妨可以将摩尔投票法的工作原理想象为诸侯争霸,假设每个国家都是全民皆兵,并且打起仗来都是以 1 换 1 的形式消耗人口,当一个国家人口总数为 0,那么 Gameover,OK,如果某国人口数量超过所有国家总人口的一半,最终赢家就肯定是它。

num = [2, 2, 4, 2, 3, 6, 2]
major = num[0]
count = 0
for i in num:
if count == 0:
major = i
if i == major:
count += 1
else:
count -= 1
if num.count(major) > len(num)/2:
print("主要元素是",major)
else:
print("不存在主要元素")

 

posted @ 2022-07-06 18:26  DICEi  阅读(77)  评论(0)    收藏  举报