假设列表
[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是因为它是列表中的第一项,然后检查以下项是否与前一项不同。如果答案为是,则计算相同项目的出现,直到找到新项目为止。然后重复该过程。谁比我更熟练,可以给我一个提示,以获得上面列出的所需输出?提前谢谢
答案 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)
它与您想要的输出不匹配,但您想要的输出看起来似乎只是在试图表现出来的一种错误