【问题标题】:how to count consecutive in a list?如何在列表中连续计算?
【发布时间】:2020-05-26 08:58:28
【问题描述】:

我有一个列表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。 预期输出:

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)

【问题讨论】:

  • 到目前为止你编码了什么?
  • 看看itertools.groupby
  • 对不起,我忘了在那里发布我的代码。现在我编辑了我的问题。

标签: python arrays python-3.x list


【解决方案1】:

您的代码有问题

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

输出

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

【讨论】:

  • 是的,这就是答案。谢谢。但我想使用两个列表,因为它们有不同的用途
  • 但是 ans_charged 和 ans_discharged 列表的元素数量与测试列表中的元素数量不同。
  • 答案应该是这样的: answer_charged =[150,150,150,150,0,0,0,0,0,0,150,150,150,0,0,0,0] 和 answer_discharged= [0,0,0,0 ,0,-150,-150,-150,-150,0,0,0,0,-150,-150,-150,-150]
【解决方案2】:

如果您被允许使用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 为空),因此我不必为短列表实现特殊情况。最后我变平了 - 将lists 中的list 变成平的list

【讨论】:

    【解决方案3】:

    解决方案: 不需要 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)
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        最近更新 更多