繁体   English   中英

如何在列表中连续计算?

[英]how to count consecutive in a list?

我有一个列表decider = [1,1,1,1,1,0,0,0,1,1,1,0,0,0,0] 在这个列表中,我想在 1 前面打印 +150,在 0 前面打印 -150。但条件是,你只能连续输入 +150 或 -150 最多 4 次,之后你必须输入 0如果仍然在列表中,您将得到 0 或 1。预期 Output:

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)

您的代码有问题

  • 您没有重置Charge_counterDischarge_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)

Output

[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]

如果您被允许使用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 ),因此我不必为短列表实现特殊情况。 最后,我将listlist扁平化为扁平list

解决方案:不需要 2 个列表。 需要重新设置charge_counter = 0和discharge_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)

您需要在“if i == 1”条件下将 Discharge_counter 设置为 0,在“else”条件下您还需要将 Charge_counter 设置为 0。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM