Python练习题答案: 简单有趣#191:和普通的数字【难度:2级】--景越Python编程实例训练营,1000道上机题等你来挑战

简单有趣#191:和普通的数字【难度:2级】:

答案1:

from itertools import groupby
from operator import itemgetter

def sum_of_regular_numbers(arr):
    xs = [(i, x-y) for i, (x, y) in  enumerate(zip(arr, arr[1:]))]
    it = (list(grp) for key, grp in groupby(xs, key=itemgetter(1)))
    it = ((grp[0][0], len(grp)) for grp in it if len(grp) > 1)
    return sum(sum(arr[i:i+n+1]) for i, n in it)

答案2:

def sum_of_regular_numbers(arr):
    # (step size, step count, sequence base)
    grouped = [(b - a, 1, a) for a, b in zip(arr[:-1], arr[1:])]
    # Collate the groups by step size
    i = 0
    while i < len(grouped) - 1:
        if grouped[i][0] == grouped[i + 1][0]:
            grouped[i] = (grouped[i][0], grouped[i][1] + 1, grouped[i][2])
            del grouped[i + 1]
        else:
            i += 1
    # Use (first + last) * elements / 2 to find sum of each sequence longer than 2 elements long
    return sum((2 * base + step * steps) * ((steps + 1) / 2) for step, steps, base in grouped if steps >= 2)

答案3:

def sum_of_regular_numbers(arr):
    i, s = 0, 0
    while i < len(arr)-2:
        n, step = 1, arr[i]-arr[i+1]
        while i+1+n < len(arr) and arr[i+n]-arr[i+1+n] == step: n += 1
        if n >= 2: s += sum(arr[i:i+n+1])
        i += n
    return s​

答案4:

from itertools import groupby

def sum_of_regular_numbers(arr):
    dif = [list(g) for c, g in groupby(b - a for a, b in zip(arr, arr[1:]))]
    res = 0
    i = 0
    for cons in dif:
        if len(cons) > 1:
            res += sum(arr[i:i + len(cons) + 1])
        i += len(cons)
    return res​

答案5:

from itertools import groupby
from operator import itemgetter

def sum_of_regular_numbers(arr):
    result = 0
    xs = [(i, x-y) for i, (x, y) in  enumerate(zip(arr, arr[1:]))]
    it = (list(grp) for key, grp in groupby(xs, key=itemgetter(1)))
    it = ((grp[0][0], len(grp)) for grp in it if len(grp) > 1)
    return sum(sum(arr[i:i+n+1]) for i, n in it)

答案6:

def sum_of_regular_numbers(arr):
    answer = 0
    counter = 1
    first, last, diff = arr[0], arr[0], None
    for number in arr[1:]:
        thisDiff = number - last
        if counter == 1:
            last, diff = number, thisDiff
            counter += 1
        elif thisDiff == diff:
            last = number
            counter += 1
        else:
            if counter >= 3:
                answer += (first + last) * counter // 2
            counter = 2
            first, last, diff = last, number, thisDiff
    if counter >= 3:
        answer += (first + last) * counter // 2
    return answer​

答案7:

from itertools import groupby, chain

def sum_of_regular_numbers(arr):
    lst = (list(list(i[0]) for i in k ) for _, k in groupby((zip((zip(arr, arr[1:])), (abs(x[0]-x[1]) for x in zip(arr, arr[1:])))), lambda z: z[1]))
    return sum(map(sum, filter(lambda z: len(z)>2, map(lambda z: set(chain(*z)), filter(lambda z: len(z)>1, lst)))))

答案8:

def sum_of_regular_numbers(a):
    s = 0; b = 0; t = 0
    while b < len(a)-2:
        s = a[b] - a[b+1]
        i = b+2
        while i < len(a) and a[i-1]-a[i] == s:
            i += 1
        if i-b >= 3:
            t += sum(a[b:i])
        b = i-1
        
    return t
​

答案9:

def sum_of_regular_numbers(a):
    s = 0
    b = 0
    t = 0
    while b < len(a)-2:
        l = a[b:b+2]
        s = a[b] - a[b+1]
        i = b+2
        while i < len(a) and a[i-1]-a[i] == s:
            l.append(a[i])
            i += 1
        if len(l) > 2:
            t += sum(l)
            b = i-1
        else:
            b += 1
        
    return t​

答案10:

from itertools import groupby
from operator import sub

def sum_of_regular_numbers(arr):
    grouped = [list(g[1]) for g in groupby(zip(arr, arr[1:]), lambda pair: sub(*pair))]
    unpaired = [[x[0] for x in y] + [y[-1][1]] for y in grouped]
    return sum(sum(seq) for seq in unpaired if len(seq) > 2)



Python基础训练营景越Python基础训练营QQ群

在这里插入图片描述
欢迎各位同学加群讨论,一起学习,共同成长!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值