목록에서 숫자를 합산하지만 0이 발생한 후 부호를 변경하십시오.


9

목록의 모든 숫자를 합산해야합니다. 0이 발생하면 빼기 시작하여 다른 0이 될 때까지 더하기를 시작하십시오.

예를 들면 다음과 같습니다.

[1, 2, 0, 3, 0, 4] -> 1 + 2 - 3 + 4 = 4
[0, 2, 1, 0, 1, 0, 2] -> -2 - 1 + 1 - 2 = -4
[1, 2] -> 1 + 2 = 3
[4, 0, 2, 3] = 4 - 2 - 3 = -1

이것이 내가 시도한 것입니다.

sss = 0

for num in numbers:
    if 0 == num:
        sss = -num
    else:
        sss += num
return sss

답변:


17

목록의 요소가 0이면 부호를 변경하십시오.

result = 0
current_sign = 1
for element in your_list:
    if element == 0:
       current_sign *= -1
    result += current_sign*element

2

다음은 목록의 값이 0 일 때마다 두 연산자 (더하기 및 빼기) 사이를 순환하는 솔루션입니다.

from operator import add, sub
from itertools import cycle

cycler = cycle([add, sub])
current_operator = next(cycler)

result = 0
my_list = [1, 2, 0, 3, 0, 4]

for number in my_list:
    if number == 0:
        current_op = next(cycler)
    else:
        result = current_operator(result, number)

1

이 시도:

d = [1, 2, 0, 3, 0, 4]

sum = 0
sign = False
for i in d:
    if i == 0:
        if sign == False:
            sign = True
        else:
            sign = False
    else:
        if sign == False:
            sum += i
        else:
            sum -= i
print(sum)

if 절 대신을 if i == 0:사용할 수 있습니다 sign = not sign. 참조 repl.it/repls/RigidCrazyDeletions을

1
내장 sum함수를 덮어 쓰지 마십시오 !! 나는 그것이 OP sss대신에 OP가 사용 된 이유라고 생각합니다.sum
Jab

1

operator모듈과 비트 부정의 또 다른 변형 ~:

import operator

def accum_on_zero(lst):
    res = 0
    ops, pos = (operator.add, operator.sub), 0
    for i in lst:
        if i == 0:
            pos = ~pos
        res = ops[pos](res, i)
    return res


print(accum_on_zero([1, 2, 0, 3, 0, 4]))     # 4
print(accum_on_zero([0, 2, 1, 0, 1, 0, 2]))  # -4 

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.