【问题标题】:how to count consecutive duplicates in a python list [duplicate]如何计算python列表中的连续重复项[重复]
【发布时间】:2017-01-13 09:36:07
【问题描述】:

我有一个列表如下,只包含 (-1)s 和 1s:

list1=[-1,-1,1,1,1,-1,1]

我正在尝试将连续重复的数量附加到列表中,例如:

count_dups=[2,3,1,1] 

我尝试创建一个新列表并使用 zip 函数作为第一步,但是 由于截止终值,似乎无法继续

list2=list1[1:]
empty=[]
for x,y in zip(list1,list2):
    if x==y:
        empty.append(x)
    else:
        empty.append(0)

【问题讨论】:

  • 你为什么在这里使用zip?它似乎与任务无关。
  • 我认为你应该改用itertools.groupby
  • this question。它有一个传统的实现和一个使用 groupby 的实现。您应该能够调整它们以满足您的要求。

标签: python python-3.x


【解决方案1】:

你可以使用itertools.groupby:

from itertools import groupby
list1 = [-1, -1, 1, 1, 1, -1, 1]
count_dups = [sum(1 for _ in group) for _, group in groupby(list1)]
print(count_dups)

输出

[2, 3, 1, 1]

【讨论】:

  • len(list(group)) 在小序列上往往会更快,但如果你有一个非常大的迭代器和大的连续值,那么可能值得考虑 sum(1 for _ in group)
  • 我只是在编辑它以使用迭代器而不是强制转换为列表 =D 是的 - 我同意。
  • FWIW,在 sum 生成器表达式中以及在列表理解的外部部分中重新使用变量名称 _可能会让新编码人员感到困惑,特别是如果他们不熟悉在循环中使用 _ 作为一次性名称的约定。所以你可能要提一下_的两种用法是相互独立的。
【解决方案2】:
def count_dups(L):
    ans = []
    if not L:
        return ans
    running_count = 1
    for i in range(len(L)-1):
        if L[i] == L[i+1]:
            running_count += 1
        else:
            ans.append(running_count)
            running_count = 1
    ans.append(running_count)
    return ans

【讨论】:

    【解决方案3】:
    def count_dups(lst):
        return reduce(
            lambda a,b: (((a[-1] == b) and (a[:-2] + [a[-2]+1,a[-1]])) or (a[:-1] + [1,b])) ,
            lst[1:] ,
            [1,lst[0]]
        )[:-1]
    

    【讨论】:

      猜你喜欢
      • 2019-08-01
      • 2018-11-22
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 2019-02-04
      • 2023-03-11
      • 2014-04-19
      相关资源
      最近更新 更多