python学习记录:列表

        大家好!别看我码龄两年,但是我其实今年九月刚学python,不会其他语言,所以哪里写的不对的,请指导!

        这节课学了index(),用于找出所指定元素在列表中第一次出现的索引值,找不到会发出ValueError异常。

        还学了copy(),那个博主说这个是浅拷贝,但是他没给我们讲深拷贝是什么,浅拷贝是什么,但是有一道题他用到了一点,通过完成作业,我猜测浅拷贝是拷贝后变动原列表,但是所拷贝的列表不会随之改变,而深拷贝则会。

        作业问答题部分对切片的简单运用进行了训练。

        接下来是代码作业:

第0题:在不改变原列表的情况下,找到最后一个匹配元素的索引值。

方法一:暴力搜寻法

s = [1,3,4,2,5,4,3,2,1,3,4,2]
a = 0
n = 0

while n < len(s):
    if s[n] == 4:
        a = n  #将符合条件的n存储于n中,不受后面n += 1的影响
    n += 1

print(a)

原理很简单就是一个一个搜寻,因为n表示索引值,而且是随着循环,每循环一遍便加一,所以为

了使最后一个匹配元素的索引值不会受此影响,于是便把它储存在a中。

方法二:

s = [1,2,3,4,5,4,3,2,1,4,3]
copy_s = s.copy()  #浅拷贝列表s
copy_s.reverse()   #将列表反转一下
a = copy_s.index(4)  
print(len(s) - a - 1)  #通过该公式计算得出最后一个匹配元素的位置

这里运用了浅拷贝,改变拷贝后的列表并不会改变原列表,所以不会违反题意,接下来便可以随意变换改变后的列表来方便自己寻找最后一个匹配元素的索引值。

第1题:判断一个列表是否存在主要元素。

注解:判断列表中是否有一半的元素与中间元素相等,如果有,那该中间元素就是主要元素,如果没有,那该列表便没有主要元素。

我的方法:

s = [2,2,4,2,3,6,2]
s.sort()
a = (len(s) // 2) + 1  #获取偏中间值
if s[0] == s[a]:
    print(s[0],"为主要元素")
else:
    print("不存在主要元素")

我先将列表进行排序,用地板除来获取中间值,我刚开始是认为中间元素是列表的中间值,导致我认为排过序后,只有中间值前的元素都等于中间值,才存在主要元素,所以我通过判断第一个元素与中间值是否相等来判断一个列表是否存在主要元素。

但是我的想法是错误的,主要元素我后来思考过要满足的条件是:主要元素的个数要大于列表长度的二分之一。所以我写了一段新的代码,如下:

s = [1,2,3,2,2,1,2,2,3]
s.sort()  #将列表中的元素进行排序
n = 0
while n < s[-1]:
    a = s.count(n)  #获取每种元素的个数
    if a > (len(s) / 2):   #看个数是否超过列表总元素个数的一半
        b = n   #将n存储于a中,免受污染
        print(b,"为主要元素。")
    n += 1

这段代码的循环思路与第0题的暴力拆解法在某些部分很相像。

第2题:摩尔投票法。

据博主说这是一个算法,分为两个阶段:

第一阶段;(对抗)分选人票数两两抵消。

第二阶段:(计数)看最终留下的候选人的票数是否有效,不为0则有效。

根据这个思路,我写出了以下代码:

s = [2,2,4,2,3,6,2]
t = []
s.sort()  #将列表内的元素进行排序。
b = 0
c = s[-1]  #获取排序后的列表的最后一个元素,即列表的最大值。

while b <= c:
    a = s.count(b)  #获取每种元素的个数
    if a != 0:
        t.append(a)  #将获取的符合条件的a放入列表t中
    b += 1

for i in range(0,len(t)):
    n = 0  #将n归零,否则n会不断叠加,将永远无法符合条件。
    for j in range(0,len(t)):
        if t[i] > t[j]:
            n += 1 
            if n == len(t) - 1 and t[i] > (len(s) / 2):
                print(s[t[i] - 1],"为最终赢家!")
            if n == len(t) - 1 and t[i] <(len(s) / 2):
                print("无最终赢家!")

        n == len(t) - 1是用来判断某元素的个数是否是最大的,因为一个元素个数每大于其他元素的个数,n的值就会增加1,因为无法大于本身,所以要减1.这符合了第一阶段的条件,而它的并列条件是用于判断选票人的票数是否有效,因为如果票数大于总票数的一半,便有效,len(s)可以代表总票数,所以生成了这一条件。

        那个博主的想法巧妙多了,接下来给大家展示一下:

nums = [2, 2, 4, 2, 3, 6, 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) / 2:
    print("主要元素是:", major)
else:
    print("不存在主要元素。")

        这段代码的话,是先获取列表的第一位数,然后比较下一个数与现在这个数相不相等,若相等count就加一,反之减一,也就是相当于一个对抗的过程,一对一抵消,则个数等于或大于总个数一半的数会成为判断条件,也就是major,但是个数为总个数的一半的不符合胜者条件,于是有了统计阶段这段代码

        

        我刚刚知道代码段可以选择是什么语言的,这次听了学长学姐的意见,在代码块里面加了注解,这样应该大家就能比较好看懂了。

        这节课的学习笔记就到这里啦!谢谢大家!!!     \^o^/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值