r format(Sys.time(),'%Y年 %b %d日')
”knitr::opts_chunk$set(echo = TRUE)
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))
列表中替换元素的方法有:
heros = ['蜘蛛侠', '绿巨人', '神奇女侠', '鹰眼', '灭霸', '雷神']
heros[0:2]=["猪猪侠","女巨人"]
print(heros)
s = [1, 2, 3, 4, 5]
s[1:2] = [6, 6]
print(s)
打印内容错误答案是[1,[6, 6],3,4,5]
正确答案是上面反应的内容。
s = [1, 2, 3, 4, 5]
s[:] = "FishC"
print(s)
打印错误内容为["FishC"]
s = [1, 2, 3, 4, 5]
s[2:4] = []
print(s)
打印结果为[1, 2, 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不会更改。
我第一个想到的方法就是使用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的序列。因此,这个循环将从列表的最后一个元素开始,并向前遍历整个列表。查找的两种方法,都是用了反转类似功能,来完成问题
思路:先排序,然后取出中间元素,然后对中间元素使用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 换 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编辑,大家凑合看哈,有问题可以私下交流。