Python Logi c, чтобы найти сумму подсписка, удовлетворяющего условию - PullRequest
1 голос
/ 10 марта 2020

Мне нужно найти сумму элементов списка между -1 и -1.

Я пробовал это решение, но оно добавляет элементы 1,2,3 к 1,1,1,1. Можете ли вы помочь мне с лучшей логикой c?

lis = [1,2,3,4,-1,1,1,1,1,-1,1,2,3]
sum = 0
newlis = []
    for i in range(0,len(lis)-1):
        if lis[i] == -1:
            while i+1 < len(lis) and lis[i+1]!=-1:
                sum = sum+lis[i+1]
                i = i+1
print(sum)

Ответы [ 6 ]

3 голосов
/ 10 марта 2020

Вы можете использовать:

idx = [i for i, v in enumerate(lis, 1) if v == -1]
print(sum(lis[idx[0]:idx[1]-1]))
# 4

Демо

2 голосов
/ 10 марта 2020

Вот пример, который работает без lambda

lis = [1,2,3,4,-1,1,1,1,1,-1,1,2,3]

first = lis.index(-1) + 1
second = lis[first:].index(-1) + first

result = sum(lis[first:second])
1 голос
/ 10 марта 2020

Один из подходов состоит в том, что вы можете создать логический флаг, который устанавливает значение true, когда вы видите -1, и устанавливаете его обратно в false, когда вы видите второй -1 (или разрыв). Вы добавляете числа, если флаг верен.

lis = [1,2,3,4,-1,1,1,1,1,-1,1,2,3]
sum = 0
flag = False;
for i in range(len(lis)):
    if not flag:
        if lis[i] == -1:
            flag = True
    elif lis[i] == -1:
        flag = False #this line could be omitted
        break
    else:
        sum += lis[i]
print(sum)

1 голос
/ 10 марта 2020

Сначала мы можем вычислить индексы, где появляется -1:

In [12]: l = [1,2,3,4,-1,1,1,1,1,-1,1,2,3]
In [16]: indexes = [index for index in range(len(l)) if l[index] == -1]
In [17]: indexes
Out[17]: [4, 9]

Теперь мы знаем, что -1 появляется в индексах 4 и 9. Чтобы убедиться, что у нас есть правильный набор чисел:

In [20]: l[indexes[0]:indexes[1]]
Out[20]: [-1, 1, 1, 1, 1]

Итак, теперь вычислить сумму проще:

In [19]: sum(l[indexes[0]:indexes[1]])
Out[19]: 3
0 голосов
/ 11 марта 2020

Вы можете использовать lis.index, чтобы найти первое -1. Он также предлагает второй параметр, с которого начинается поиск, поэтому вы также можете использовать его для поиска второго -1. Тогда просто возьмите кусочек между ними и сложите его.

>>> start = lis.index(-1) + 1
>>> stop = lis.index(-1, start)
>>> sum(lis[start:stop])
4
0 голосов
/ 10 марта 2020

Вы имели в виду это?

sum(filter(lambda n: -1 <= n <= 1, lis))

или без лямбды:

def f(n):
  return -1 <= n <= 1

sum(filter(f, lis))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...