使用Python列表中的订单保留重复计数

时间:2015-01-16 17:00:34

标签: python list no-duplicates

假设列表

  

[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是因为它是列表中的第一项,然后检查以下项是否与前一项不同。如果答案为是,则计算相同项目的出现,直到找到新项目为止。然后重复该过程。谁比我更熟练,可以给我一个提示,以获得上面列出的所需输出?提前谢谢

2 个答案:

答案 0 :(得分: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]

<强>更新

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

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

答案 1 :(得分:0)

试试这个

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)

它与您想要的输出不匹配,但您想要的输出看起来似乎只是在试图表现出来的一种错误