在 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]
假设列表
[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]