Как я могу удалить негативы в индексированной скобке, если внутри скобки есть по крайней мере один негатив и по крайней мере один позитив?

#python #python-3.x #list

Вопрос:

 sumranges= [4, 4, 4, 4, 2, 2, 1, 1, 1] amounts=[' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', '-2.5', ' 5.0', '-5.0', ' 5.0', ' 5.0', ' 25.0']  for i in range(0, len(amounts)):  amounts[i] = float(amounts[i])   newarray=[] count=0  if sum(sumranges) == len(amounts):   for sumrange in sumranges:  start=int(sum(sumranges[0:count]))  end=int(start sumrange)  newarray.append(sum( amounts[start:end] ) )  count =1    print(newarray) else:  print("Sum of sumranges isn't equal to length of amounts array")  

результат таков

 [10.0, 10.0, 10.0, 10.0, 0.0, 0.0, 5.0, 5.0, 25.0]  

Однако результат должен быть:

 [" 10.0", " 10.0", " 10.0", " 10.0", " 2.5", " 5.0", " 5.0", " 5.0", " 25.0"]  

Первые 0,0 произошли, потому что сумма 2,5 -2,5 равна 0. Аналогично второму 0,0, но на этот раз с 5 -5. Как я могу удалить -2,5, чтобы это было 2,5, а для второго результата должно быть 5. Я не могу просто удалить все негативы, потому что код также должен работать для этих вторых данных:

 sumranges=[4,2,2,1,1,1,1] amounts=['-2.5', '-2.5', '-2.5', '-2.5', '-2.5', '-2.5', '-5.0', '-5.0', '-5.0', '-5.0', '-25.0', ' 99.999999999']  

результат должен быть:

 ["-10.0", "-5.0", "-10.0", "-5.0", "-5.0", "-25.0", " 99.999999999"]  

Комментарии:

1. Можете ли вы объяснить логику этой операции?

2. Код работает так же, как суммирование первых 4 во втором списке, а затем следующих 4, 4, 4 и следующих 2. Таким образом, первый список используется в качестве диапазона для второго списка.

Ответ №1:

IIUC, вы могли бы отфильтровать свои отрицательные числа:

 sumranges= [4, 4, 4, 4, 2, 2, 1, 1, 1] amounts=[' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', '-2.5', ' 5.0', '-5.0', ' 5.0', ' 5.0', ' 25.0']  out = [] start=0 for step in sumranges:  end = start step  l = list(map(float, amounts[start:end]))  if len(set(i lt; 0 for i in l)) gt; 1:  l = [i for i in l if igt;0]  s = sum(l)  out.append('%s%.1f' % (' ' if s gt;=0 else '' , s))  start = end   out  

выход:

 [' 10.0', ' 10.0', ' 10.0', ' 10.0', ' 2.5', ' 5.0', ' 5.0', ' 5.0', ' 25.0']  

выход со вторым входом:

 ['-10.0', '-5.0', '-10.0', '-5.0', '-5.0', '-25.0', ' 100.0']  

Комментарии:

1. код также должен работать для вторых данных, как указано в сообщении. sumranges=[4,2,2,1,1,1] суммы=[‘-2.5’, ‘-2.5’, ‘-2.5’, ‘-2.5’, ‘-2.5’, ‘-2.5’, ‘-5.0’, ‘-5.0’, ‘-5.0’, ‘-5.0’, ‘-25.0’, ‘ 99.999999999’]. С результатом: [«-10.0», «-5.0», «-10.0», «-5.0», «-5.0», «-25.0″, » 99.999999999″]. Вот почему я не могу просто удалить все негативы.

2. Ну вам логика непонятна. Как вы решаете, что такое-x y?

3. вы решаете это из-за диапазона, например, если sumranges, 4-й пункт, который равен 2. Это означает, что в списке сумм это 2 числа, это » 2,5″, «-2,5″. Потому что 4 4 4 4, и теперь вы нажмете 2, что означает 15-е и 16-е число в списке сумм, которое равно » 2,5″, «-2,5», поэтому мне нужно удалить -2,5 (отрицательное значение в этом).

4. Извините, это не совсем ясное объяснение, все равно проверьте мое обновление.

5. Я хочу взять список, а затем выборочно суммировать диапазон из этого списка? Затем суммируйте чистый диапазон от последнего индекса предыдущего суммированного диапазона и т. Д.

Ответ №2:

Есть вопрос с таким ответом. Этот код даст желаемый результат для вашего второго примера (за исключением форматирования значения 99,99999).

Если я применю те же данные, что и в вашем первом примере, это даст результат, который вы считаете неправильным.

Ваши объяснения о том, почему и когда вы хотите «удалить» отрицательное значение, неясны.

Итак, показав вам этот код, он может помочь вам уточнить, что вам нужно:-

 def process(s, a):  assert sum(s) == len(a)  n = []  o = 0  for _s in s:  t = sum(list(map(float, a[o:o _s])))  n.append(f'{t: .2f}')  o  = _s  return n  sumranges = [4, 4, 4, 4, 2, 2, 1, 1, 1] amounts = [' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5',  ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', '-2.5', ' 5.0', '-5.0', ' 5.0', ' 5.0', ' 25.0']  print(process(sumranges, amounts))  sumranges = [4, 2, 2, 1, 1, 1, 1] amounts = ['-2.5', '-2.5', '-2.5', '-2.5', '-2.5', '-2.5',  '-5.0', '-5.0', '-5.0', '-5.0', '-25.0', ' 99.999999999']  print(process(sumranges, amounts))  

Ответ №3:

Вы можете использовать итератор для формирования групп диапазонов внутри понимания списка, а затем вычесть сумму отрицательных значений из суммы группы, если самый большой элемент не является отрицательным.

Вот функция, которая это сделает (в списке правильных числовых значений):

 def sumPosRanges(amounts,sumranges):  return [ sum(r)-sum(n for n in r if nlt;0)*(max(r)gt;0)  for iAmounts in [iter(amounts)] for sr in sumranges  for r in [[next(iAmounts) for _ in range(sr)]] ]  

Первый ввод:

 sumranges= [4, 4, 4, 4, 2, 2, 1, 1, 1] amounts=[' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5',  ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5', ' 2.5',  ' 2.5', '-2.5', ' 5.0', '-5.0', ' 5.0', ' 5.0', ' 25.0']  sums = sumPosRanges(map(float,amounts),sumranges)   print([f"{s: 3.1f}" for s in sums])  [' 10.0', ' 10.0', ' 10.0', ' 10.0', ' 2.5', ' 5.0', ' 5.0', ' 5.0', ' 25.0']  

Второй ввод:

 sumranges=[4,2,2,1,1,1,1] amounts=['-2.5', '-2.5', '-2.5', '-2.5', '-2.5', '-2.5',   '-5.0', '-5.0', '-5.0', '-5.0', '-25.0', ' 99.999999999']  sums = sumPosRanges(map(float,amounts),sumranges)   print([f"{s: 3.1f}" for s in sums])  ['-10.0', '-5.0', '-10.0', '-5.0', '-5.0', '-25.0', ' 100.0']