-1

假设列表

[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 是因为它是列表中的第一项而被写入,然后检查以下是否与上一个不同。如果答案是肯定的,则计算相同项目的出现次数,直到找到新项目。然后重复该过程。任何比我更熟练的人可以给我一个提示以获得上面列出的所需输出吗?先感谢您

4

2 回答 2

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]
于 2015-01-16T17:15:20.333 回答
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)

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

于 2015-01-16T17:07:54.090 回答