【问题标题】:Compute the number of consecutive identical values in a list计算列表中连续相同值的数量
【发布时间】:2016-03-11 19:29:11
【问题描述】:

我有一个二进制值列表:1 = 可同步,0 = 不可同步。每个二进制值表示一个人当天是否可同步。

person1=[1,1,0,1,1,0,1,1,1]

我想制作另一个列表,计算一个人可以连续同步多少天。当出现 0 时,计数器基本上会重置。

因此对于上面的示例,输出将如下所示:

person1=[1,2,0,1,2,0,1,2,3]

我的问题是每当列表遇到 0。我不知道如何重置它。试了好几种方法,都不行。

x=[1,1,1,1,1]
y=[]

for index, value in enumerate(x):
     y.append(value+sum(x[:index]))

print(y)
...

[1, 2, 3, 4, 5]

感谢任何帮助。我认为使用递归可能会有所帮助。

【问题讨论】:

  • 不要在列表上使用 sum,那样会越来越慢。而是在 for 循环之外设置一个最初为 0 的变量;然后每 1 天求和 1,如果看到 0,则将其设置为 0。

标签: python python-3.x


【解决方案1】:

使用itertools.groupby,您可以生成一个包含同步总数的列表。

import itertools

person1=[1,1,0,1,1,0,1,1,1]
syncs = [sum(v) for _, v in itertools.groupby(person1)]

输出:

[2, 0, 2, 0, 3]

如果您只想获取此人“可同步”的最长连续天数,只需执行以下操作:

max_syncs = max[sum(v) for _, v in itertools.groupby(person1) if _]

【讨论】:

  • 感谢您的回答!你能解释一下列表理解的if _ 部分的作用吗?
  • Here 你可以找到关于_的参考资料。
【解决方案2】:

这样做:

i = 0
y = []
for value in person1:
    if value:
        i += 1
    else:
        i = 0
    y.append(i)

没有理由创建一个列表。你只需要跟踪一个计数器。

【讨论】:

    最近更新 更多