как посчитать подряд в списке? - PullRequest
0 голосов
/ 26 мая 2020

У меня есть список decider = [1,1,1,1,1,0,0,0,1,1,1,0,0,0,0]. В этом списке я хочу напечатать +150 перед 1 и -150 перед 0. Но условие состоит в том, что вы можете вводить +150 или -150 только до 4 раз подряд, после этого вы должны поставить 0 в списке, если все еще, вы получите 0 или 1. Ожидаемый результат:

decider result
1        150
1        150
1        150
1        150
1         0
0       -150
0       -150
0       -150
1        150
1        150
1        150
0       -150 
0       -150
0       -150
0       -150 

Мой подход:

test = [1,1,1,0,0,0,0,1,1,1,1]
Charge_counter = 0
Discharge_counter = 0
charge = []
discharge = []
for i in test:
    if i ==1:
        Charge_counter += 1
        if Charge_counter <=4:
            charge.append(150)
        else:
            charge.append(0)
    else:
        Discharge_counter += 1
        if Discharge_counter <= 4:
            discharge.append(-150)
        else:
            discharge.append(0)
print(charge)
print(discharge)

Ответы [ 4 ]

2 голосов
/ 26 мая 2020

Проблемы с вашим кодом

  • Вы не сбрасываете Charge_counter и Discharge_counter
  • Необязательно использовать 2 списка

Решение

test = [1,1,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0]
charge = 0
discharge = 0
ans_charged = []
ans_discharged = []

for i in test:
    if i == 1 and charge < 4:
        ans_charged.append(150)
        ans_discharged.append(0)
        charge +=1
        discharge = 0 
    elif i == 1:
        ans_charged.append(0)
        ans_discharged.append(0)
        discharge = 0 
    elif i == 0 and discharge < 4:
        ans_discharged.append(-150)
        ans_charged.append(0)
        discharge += 1
        charge = 0
    elif i == 0:
        ans_discharged.append(0)
        ans_charged.append(0)
        charge = 0 
print(ans_charged)
print(ans_discharged)

Выход

[150, 150, 150, 150, 0, 0, 0, 0, 0, 0, 150, 150, 150, 0, 0, 0, 0]
[0, 0, 0, 0, 0, -150, -150, -150, -150, 0, 0, 0, 0, -150, -150, -150, -150]
1 голос
/ 26 мая 2020

Решения: 2 списка НЕ ​​нужны. Необходимо сбросить значения charge_counter = 0 и разряда_counter = 0

test = [1,1,1,1,1,0,0,0,1,1,1,0,0,0,0]
charge_counter = 0
discharge_counter = 0
charge = []
for i in test:
    if i ==1 and charge_counter <4:
        charge.append(150)
        charge_counter += 1
        discharge_counter = 0
    elif i ==0 and discharge_counter <4:  
        charge.append(-150)
        discharge_counter += 1
        charge_counter = 0
    else:
        charge.append(i)
print(charge)
1 голос
/ 26 мая 2020

Если вам разрешено использовать itertools, то вы можете сделать:

import itertools
decider = [1,1,1,1,1,0,0,0,1,1,1,0,0,0,0]
temp = [150 if i==1 else -150 for i in decider]
runs = [list(i[1]) for i in itertools.groupby(temp)]
print(runs)  # [[150, 150, 150, 150, 150], [-150, -150, -150], [150, 150, 150], [-150, -150, -150, -150]]
runs = [i[:4]+[0]*(len(i)-4) for i in runs]
print(runs)  # [[150, 150, 150, 150, 0], [-150, -150, -150], [150, 150, 150], [-150, -150, -150, -150]]
result = list(itertools.chain(*runs))
print(result)  # [150, 150, 150, 150, 0, -150, -150, -150, 150, 150, 150, -150, -150, -150, -150]

Объяснение: сначала я меняю 1 на 150, а все остальное на -150, а затем нахожу последовательные прогоны 150 и -150 (обратите внимание, что itertools.groupby работает таким образом, а не SQL GROUP BY), затем я для каждого подсписка получаю 4 первых элемента и объединяю его с (исходная длина - 4) нулями. Обратите внимание, что в Python разрешено умножать list на отрицательное число (в результате получается пустой list), поэтому мне не нужно реализовывать особый случай для коротких списков. Наконец я сглаживаю - превращаю list из list с в плоские list.

0 голосов
/ 26 мая 2020

Вам нужно установить Discharge_counter на 0 в условии «if i ​​== 1», также вам необходимо установить Charge_counter на 0 в условии «else».

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