在 Python 列表中保留顺序的重复计数

Duplicates counting with order order preserving in Python lists

假设列表

[7,7,7,7,3,1,5,5,1,4]

我想删除重复项并在保留列表顺序的同时对它们进行计数。为了保留删除重复项的列表的顺序,我使用函数

def unique(seq, idfun=None):
   # order preserving
   if idfun is None:
       def idfun(x): return x
   seen = {}
   result = []
   for item in seq:
       marker = idfun(item)
       if marker in seen: continue
       seen[marker] = 1
       result.append(item)
   return result

这是给我的输出

[7,3,1,5,1,4]

但我想要的期望输出(在最终列表中可能存在)是:

[7,3,3,1,5,2,4]

7 是因为它是列表中的第一项,所以检查下面是否与前面的不同。如果答案是肯定的,计算相同项目的出现次数,直到找到新的项目。然后重复该过程。比我更熟练的人可以给我提示以获得上面列出的所需输出吗?提前谢谢你

试试这个

import collections as c
lst = [7,7,7,7,3,1,5,5,1,4]
result = c.OrderedDict()
for el in lst:
    if el not in result.keys():
        result[el] = 1
    else:
        result[el] = result[el] + 1

print result

打印出:OrderedDict([(7, 4), (3, 1), (1, 2), (5, 2), (4, 1)])

虽然它给出了一本字典。对于列表,请使用:

lstresult = []
for el in result:
    # print k, v
    lstresult.append(el)
    if result[el] > 1:
        lstresult.append(result[el] - 1)

它与您想要的输出不匹配,但您想要的输出也似乎是对试图表示的内容的一种破坏

也许是这样的?

>>> from itertools import groupby
>>> seen = set()
>>> out = []
>>> for k, g in groupby(lst):
    if k not in seen:
        length = sum(1 for _ in g)
        if length > 1:
            out.extend([k, length])
        else:
            out.append(k)
        seen.add(k)
...         
>>> out
[7, 4, 3, 1, 5, 2, 4]

更新:

根据你的 我猜你想要这样的东西:

>>> out = []
>>> for k, g in groupby(lst):
    length = sum(1 for _ in g)
    if length > 1:
        out.extend([k, length])
    else:
        out.append(k)
...         
>>> out
[7, 4, 3, 1, 5, 2, 1, 4]