简体   繁体   中英

How can I find the sum of numbers in a list that are not adjacent to a given number?

Given a list of integers and number, I want to find the sum of all numbers in the list such that numbers and before and after a given number are not added. The given number should also be excluded from the numbers used for the final sum.

Examples:

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 

In the first example, only the number 4 is not adjacent to the number 2. Thus the sum is 4. In the last example, no numbers meet the criteria so the sum is 0.

This is what I tried:

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)

However, my code only works for first and third example.

I worked through your code and here is a working solution:

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  

The idea is to create a temp array that saves items that do belong in the summation. Otherwise, we ignore them. I tried all the tests you gave and it seems to be working fine. Hope this helps.

Get the indexes of the element into a list. +1 and -1 to those will give you indexes of 'before' and 'after' elements. Then take the sum avoiding elements in all these indexes.

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)

Output

5

Why not just use a if statement and generate a new list instead of removing from the list?

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)

OUTPUT

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM