PythonYC21 学习笔记


title: “PythonYC21”
author: “hou wei”
date: “上次运行时间是r format(Sys.time(),'%Y年 %b %d日')
output: html_document

knitr::opts_chunk$set(echo = TRUE)

问答题

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

heros = ['蜘蛛侠', '绿巨人', '黑寡妇', '鹰眼', '灭霸', '雷神']

heros[heros.index('黑寡妇')] = '神奇女侠'

for i in range(len(heros)):
    if heros[i] == '黑寡妇':
        heros[i] = '神奇女侠'
eros = ['神奇女侠' if x == '黑寡妇' else x for x in heros]

heros = list(map(lambda x: '神奇女侠' if x == '黑寡妇' else x, heros))

列表中替换元素的方法有:

  1. 使用列表索引方法查找和替换Python列表元素。
  2. 使用for循环方法查找和替换Python列表中的元素。
  3. 使用列表推导方法查找和替换Python List元素。
  4. 使用map方法查找并替换Python列表元素。

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

heros = ['蜘蛛侠', '绿巨人', '神奇女侠', '鹰眼', '灭霸', '雷神']

heros[0:2]=["猪猪侠","女巨人"]

print(heros)

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)

打印错误内容为["FishC"]

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, 3, 4, 5] 此处设计到拷贝与赋值的操作,浅拷贝与深拷贝的区别。
这是因为在Python中,列表是可变对象。当你将一个列表赋值给另一个变量时,它们实际上引用了相同的列表对象。因此,当你更改其中一个列表时,另一个列表也会更改。当你将s赋值给t时,它们实际上引用了相同的列表对象。因此,当你更改s中的第三个元素时,t也会更改。如果你想避免这种情况,可以使用切片操作符来复制列表:

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

这将创建s的副本,并将其赋值给t。现在,当你更改s中的第三个元素时,t不会更改。

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

我第一个想到的方法就是使用for循环,第二个方法就是使用pop()函数然后使用if判断pop()函数可以从列表中删除并返回最后一个元素,但是,如果您想要找到最后一个匹配元素的下标,pop方法解决不了。

my_list = [1, 2, 3, 4, 5, 3]
last_index = len(my_list) - my_list[::-1].index(3) - 1
print(last_index)

使用[::-1]切片反转列表,然后使用.index()方法查找第一个匹配元素的下标。最后,使用len()函数从列表末尾计算最后一个匹配元素的下标。

def find_last_index(lst, value):
    for i in range(len(lst)-1, -1, -1):
        if lst[i] == value:
            return i
    return None

my_list = [1, 2, 3, 4, 5, 3]
last_index = find_last_index(my_list, 3)
print(last_index)  
  

定义一个函数来查找最后一个匹配元素的下标。range(len(lst)-1, -1, -1)返回一个从列表的最后一个元素的下标开始,到0为止,步长为-1的序列。因此,这个循环将从列表的最后一个元素开始,并向前遍历整个列表。查找的两种方法,都是用了反转类似功能,来完成问题

动动手

0.如果有一个列表,其中占比超过一半的元素称之为主要元素,那么如何获取一个列表的主要元素呢?题目给定的列表是:[2, 2, 4, 2, 3, 6, 2]

思路:先排序,然后取出中间元素,然后对中间元素使用count()函数记数判断其是否大于len(lst)的一半。

def majority_element(lst):
    lst.sort()
    mid = len(lst) // 2
    if len(lst) % 2 == 0:
        if lst.count(lst[mid]) > len(lst) / 2:
            return lst[mid]
        elif lst.count(lst[mid - 1]) > len(lst) / 2:
            return lst[mid - 1]
        else:
            return None
    else:
        if lst.count(lst[mid]) > len(lst) / 2:
            return lst[mid]
        else:
            return None

lst = [2, 2, 4, 2, 3, 6, 2]
print(majority_element(lst))

第二种思路:先把列表里面的元素记数,找到记数最大的元素,然后与列表长度1/2进行比较。如果大于则为重要元素。

from collections import Counter

def majority_element(lst):
  dict_lst = Counter(lst)
  key = max(dict_lst.keys(), key=(lambda k: dict_lst[k]))
  if dict_lst[key] > len(lst)/2:
      return key
  else:
      return None

lst = [2, 2, 4, 2, 3, 6, 2]
print(majority_element(lst))

Convert list to dictionary with count of each element
Find element with maximum count
Check if the element is a majority element

collections是Python的内置模块之一,提供了许多有用的容器数据类型。 Counter是collections模块中的一个类,它提供了一个方便的方法来计算可迭代对象中元素的数量。 Counter是字典的子类,其中元素作为键存储,其出现次数作为值存储。 Counter类具有许多有用的方法,例如most_common()方法,该方法返回计数器中最常见的元素和它们的计数。

lambda函数是一种匿名函数,它可以在不定义函数名称的情况下定义函数。 lambda函数通常用于需要一个简单函数的地方,而不需要定义一个完整的函数。 在上面的代码中,我们使用lambda函数作为max()函数的关键字参数,以便在字典中查找最大值。lambda函数的语法如下:lambda arguments : expression其中,arguments是lambda函数的参数,expression是lambda函数的返回值。例如,以下代码定义了一个将x加倍的lambda函数:double = lambda x: x * 2 print(double(5))输出结果为10。所以key = max(dict_lst.keys(), key=(lambda k: dict_lst[k]))就是找到序列当中的数目最多的一个元素。

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

摩尔投票法有时候也被称为“多数投票法”,该算法解决的问题是如何在任意多的候选人中(选票无序),找到获得票数最多的那个。
摩尔投票法分为两个阶段:
对抗阶段:分属两个候选人的票数进行两两对抗抵消
计数阶段:计算对抗结果中最后留下的候选人票数是否有效
大家不妨可以将摩尔投票法的工作原理想象为诸侯争霸,假设每个国家都是全民皆兵,并且打起仗来都是以 1 换 1 的形式消耗人口,当一个国家人口总数为 0,那么 Gameover,OK,如果某国人口数量超过所有国家总人口的一半,最终赢家就肯定是它。

def majority_element(nums):
    count = 0
    candidate = None

    for num in nums:
        if count == 0:
            candidate = num
        count += (1 if num == candidate else -1)

    return candidate

lst = [2, 2, 4, 2, 3, 6, 2]
print(majority_element(lst))

count += (1 if num == candidate else-1)其简写,其完整代码如下:

if num == candidate:
    count += 1
else:
    count -= 1

如果num等于候选元素,则将计数器加1,否则将计数器减1。 这是摩尔投票法的核心部分,它通过消除不同的元素来找到主要元素。

全文使用rmarkdown编辑,大家凑合看哈,有问题可以私下交流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

μμ豆奶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值