前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >盘点一道Python列表基础题目

盘点一道Python列表基础题目

作者头像
Python进阶者
发布2022-04-12 19:59:57
2330
发布2022-04-12 19:59:57
举报
文章被收录于专栏:Python爬虫与数据挖掘

大家好,我是Python进阶者。

一、前言

前几天在Python最强王者交流群有个叫【Chloe】的粉丝问了一个Python列表的问题,这里拿出来给大家分享下,一起学习下。

题目如下:

代码语言:javascript
复制
SUMMER OF '69: Return the sum of the numbers in the array, except ignore sections of numbers starting with a 6 and extending to the next 9 (every 6 will be followed by at least one 9). Return 0 for no numbers.
summer_69([1, 3, 5]) --> 9

summer_69([4, 5, 6, 7, 8, 9]) --> 9

summer_69([2, 1, 6, 9, 11]) --> 14

嗯,英文提问,看上去有点懵!

二、解决过程

这个题目一看上去还是有点难度的,思路方面是个问题,这里大佬们探讨了一发。

给出了几个可行的思路。

【小王】解答

这里【小王】给出了解答,如下图所示:

代码语言:javascript
复制
def summer69(arr):
    index_of_6 = arr.index(6)
    index_of_9 = len(arr) - arr[::-1].index(9)  - 1
    sum_of_arr = 0
    for i, j in enumerate(arr):
        if index_of_6 <= i <= index_of_9:
            pass
        else:
            sum_of_arr += arr[i]
    return sum_of_arr

print(summer69([6, 6, 7, 8, 9, 8, 9, 2, 4]))

思路也很简单,找到第一个6和最后一个9出现的位置,只要在6和9中间的就全部跳过,否则累加。乍一看,没啥问题,但是套用题目中的三个测试用例,发现第一个测试用例不能通过,summer_69([1, 3, 5])会出错。

整理上来看,还是符合要求的,已经非常不错了,毕竟题目还是有点绕的。

【月神】解答

这里给出【月神】的两份代码,第一个使用了flag标签做状态转换,理解起来更加容易一些:

代码语言:javascript
复制
def summer_69(arr):
    total = 0
    flag = 1  # 允许累计的标志符
    for i in arr:
        if i == 6:
            flag = 0
        elif i == 9:
            flag = 1
            continue
        total = total + i * flag
    return total

第二个方法代码如下:

代码语言:javascript
复制
def summer_69(arr):
    total = 0
    length = len(arr)
    left = 0
    while left < length:
        if arr[left] == 6:
            for i in range(left, length):
                left = i
                if arr[i] == 9:
                    break
        else:
            total += arr[left]
        left += 1
    return total

这两种方法,给的三个测试用例都通过了。

不得不承认这个*用的确实太赞了。

不过关于题意审核方面,关于9的理解有点歧义。

看看具体来理解了,起码从测试情况来看,还是可以满足要求的。

不过不慌,稍微优化下,

这样的话,歧义方面也得到了解答,完美解决。

【Chloe】解答

这里给出了这道题目的参考答案,代码如下:

代码语言:javascript
复制
def summer_69(arr):
    total = 0
    add = True
    for num in arr:
        while add:
            if num != 6:
                total += num
                break
            else:
                add = False
        while not add:
            if num != 9:
                break
            else:
                add = True
                break
    return total

看上去逻辑还是有点难理解的,分的情况比较多。

【瑜亮老师】解答

这里【瑜亮老师】给出了一个递归的解法,代码如下:

代码语言:javascript
复制
def summer_69(arr, res=0):
    if 6 in arr and 9 in arr:
        b = arr.index(6)
        e = arr.index(9)
        if b < e:
            del arr[b:e+1]
        else:
            res = res+9
            del arr[e]
        return summer_69(arr, res)
    else:
        res += sum(arr)
        return res


print(summer_69([1, 3, 5]))
print(summer_69([4, 5, 6, 7, 8, 9]))
print(summer_69([2, 1, 6, 9, 11]))

方法行之有效,运行结果如下:

不过他本人不推荐递归写法,也比较推荐【月神】解法。

【月神】解法

这里【月神】继续补充了一个递归方法,代码如下:

代码语言:javascript
复制
def s69(arr, total=0, status=1):
    if not arr:
        return total
    if arr[0] == 9 and status == 0:
        return s69(arr[1:], total, status=1)
    elif arr[0] == 6 or status == 0:
        return s69(arr[1:], total, status=0)
    else:
        return arr[0] + s69(arr[1:], total, status)

逻辑和瑜亮老师有点差别,各有所长。测试用例目前看结果都是对的。

三、总结

大家好,我是Python进阶者。这篇文章主要分享了一道Python基础题目的问题,针对该问题给出了具体的解析和代码演示,一共5个方法,顺利帮助粉丝顺利解决了问题,还额外做了一些知识拓展,如递归等,让大家学到很多东西。

最后感谢粉丝【Chloe】提问,感谢【小王】、【月神】、【冷喵】、【瑜亮老师】、【Chloe】给出的思路、具体解析和代码演示,感谢【dcpeng】、【wangning】、【冷喵】、【冫马讠成】等人参与学习交流。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python爬虫与数据挖掘 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、前言
  • 二、解决过程
    • 【小王】解答
      • 【月神】解答
        • 【Chloe】解答
          • 【瑜亮老师】解答
            • 【月神】解法
            • 三、总结
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档