#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']