提供列表:
lst = [1,1,1,5,3,3,9,3,3,3,3,3]
我想对列表中每个项目的出现进行计数,例如,当3
在{{1之间时,在这种情况下,数字3
将被计数两次}}和5
的计数为9
,当2
在3
之后时,计数为9
。结果列表应该是该项目,然后是其计数。
5
我已经尝试了以下代码,但是会得到扩展的答案。
result = [1,3,5,1,3,2,9,1,3,5]
答案 0 :(得分:4)
itertools.groupby()
对此很有用。它将按键对项目进行分组,并使用键(包含项目的分组器)返回和迭代器。您可以将古珀刀转换为列表并取其长度:
from itertools import groupby
lst = [1,1,1,5,3,3,9,3,3,3,3,3]
def counts(lst):
for k, v in groupby(lst):
yield k
yield len(list(v))
list(counts(lst))
# [1, 3, 5, 1, 3, 2, 9, 1, 3, 5]
您也可以使用chain
以单线方式进行此操作:
from itertools import groupby, chain
lst = [1,1,1,5,3,3,9,3,3,3,3,3]
list(chain.from_iterable((k, len(list(v))) for k, v in groupby(lst)))
# [1, 3, 5, 1, 3, 2, 9, 1, 3, 5]
如果由于某种原因想要以困难的方式执行此操作,则需要跟踪当前计数和正在计数的当前事物,并在该事物发生变化时追加:
lst = [1,1,1,5,3,3,9,3,3,3,3,3]
def makeCounts(lst):
if len(lst) == 0:
return lst
res = []
# take first element
cur = lst[0]
count = 1
for n in lst[1:]:
if n == cur:
# same item — increase count
count += 1
else:
# new item — reset count and save previous
res.extend([cur, count])
count = 1
cur = n
# don't forget last item
res.extend([cur, count])
return res
makeCounts(lst)
# [1, 3, 5, 1, 3, 2, 9, 1, 3, 5]
答案 1 :(得分:0)
lst = [1, 1, 1, 5, 3, 3, 9, 3, 3, 3, 3, 3]
count = 0
result = []
def myfun(idx, arr):
global count
if idx < len(arr):
if idx + 1 < len(arr) and (arr[idx + 1] - arr[idx]) == 0:
count += 1
myfun(idx + 1, arr)
else:
result.append(arr[idx])
count += 1
result.append(count)
count = 0
myfun(idx + 1, arr)
myfun(0, lst)
print(result)
#[1, 3, 5, 1, 3, 2, 9, 1, 3, 5]