如何在列表中找到与给定数字不相邻的数字总和?

时间:2019-01-07 17:51:09

标签: python

给出一个整数和数字的列表,我想找到列表中所有数字的总和,这样就不会添加数字以及给定数字之前和之后的数字。给定的数字也应从用于最终总和的数字中排除。

示例:

mylist=[1,2,3,4]
number=2                   
#output is 4

mylist=[1,2,2,3,5,4,2,2,1,2]
number=2       
#output is 5

mylist=[1,7,3,4,1,7,10,5]
number=7
#output is 9

mylist=[1,2,1,2]
number=2                   
#output is 0 

在第一个示例中,只有数字4与数字2不相邻。因此,总和为4。在最后一个示例中,没有数字满足条件,因此总和为0。

这是我尝试过的:

def add(list1,num):
    for i,v in enumerate(list1):
       if v==num:
           del list1[i-1:i+2]
    print list1

 add([1,7,3,4,1,7,10,5],7)

但是,我的代码仅适用于第一个和第三个示例。

3 个答案:

答案 0 :(得分:0)

我已经完成了您的代码,这是一个可行的解决方案:

def check_around(array, index, num):
    return True if array[index - 1] != num and array[index + 1] != num else False

def get_result(array, num):
    arr = []

    for i, number in enumerate(array):
        if number != num:
            if i == 0 and array[1] != num: # Beginning of list
                arr.append(number)
            elif (i > 0 and i < len(array) - 1) and check_around(array, i, num): # Middle of list
                arr.append(number)
            elif i == len(array) - 1 and array[i-1] != num: # End of list
                arr.append(number)

    return arr

test = [([1,2,3,4], 2),
        ([1,2,2,3,5,4,2,2,1,2], 2),
        ([1,7,3,4,1,7,10,5], 7),
        ([1,2,1,2], 2)]

for (arr, num) in test:
    res = get_result(arr, num)
    print(f'output is {sum(res)}')  

#output is 4
#output is 5
#output is 9
#output is 0  

这个想法是创建一个临时数组,以保存确实属于求和的项目。否则,我们将忽略它们。 我尝试了您提供的所有测试,但似乎工作正常。希望这会有所帮助。

答案 1 :(得分:0)

获取元素的索引到列表中。 +1和-1将为您提供'before'和'after'元素的索引。然后将所有这些索引中的和避免元素相加。

list=[1,2,2,3,5,4,2,2,1,2]
number=2
#get all indexes of that number
list_of_indexes=[i for i,x in enumerate(list) if x==number]
#no need to remove -1 if there b'coz we are going to enumerate over 'list'
before_indexes=[i-1 for i in list_of_indexes]
#no need to remove len(list) index if present
after_indexes=[i+1 for i in list_of_indexes]
#might contain duplicate values but no problem
all_indexes_to_avoid=list_of_indexes+before_indexes+after_indexes
sum=sum([x for i,x in enumerate(list) if i not in all_indexes_to_avoid ])
print(sum)

输出

5

答案 2 :(得分:0)

为什么不只使用if语句并生成新列表,而不是从列表中删除?

def add(list,num):
    j=0
    new_list=[]
    for i in range(len(list)):
        if (i<len(list)-1 and list[i+1]==num) or list[i]==num or list[j]==num:
            pass
        else:
            new_list.append(list[i])
        j=i
    print(sum(new_list))
    print(new_list)
    return sum

add([1,2,3,4],2)
add([1,2,2,3,5,4,2,2,1,2],2)
add([1,7,3,4,1,7,10,5],7)
add([1,2,1,2],2)

输出

4
[4]
5
[5]
9
[4, 5]
0
[]