Tổng số trong một danh sách nhưng thay đổi dấu của chúng sau khi gặp 0


9

Tôi cần tổng hợp tất cả các số trong danh sách. Nếu 0 xảy ra bắt đầu trừ, cho đến 0 khác, bắt đầu thêm.

Ví dụ:

[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

Đây là những gì tôi đã thử:

sss = 0

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

Câu trả lời:


17

Thay đổi dấu khi phần tử của danh sách bằng 0.

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

2

Đây là một giải pháp xoay vòng giữa hai toán tử (cộng và trừ) bất cứ khi nào giá trị trong danh sách bằng 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

Thử cái này:

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)

Thay vì mệnh đề if của bạn trong if i == 0:bạn chỉ có thể sử dụng sign = not sign. Xem repl.it/repls/RigidCrazyDeletions
— Jab

1
Cũng đừng ghi đè sumchức năng dựng sẵn !! Tôi cho rằng đó là lý do tại sao OP sử dụng sssthay vìsum
— Jab

1

Một biến thể khác với operatormô-đun và phủ định bitwise ~:

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 

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.