问题描述
考虑第一个数字,比如 m。看看这个数字连续重复了多少次。如果连续重复 k 次,它会在输出列表中产生两个条目:第一个 数 k,然后数 m。 (这类似于我们在看到“四个 2”时的说法 [2,2,2].) 然后我们继续运行 m 之后的下一个数字。重复这个过程 直到列表中的每个数字都被考虑
示例:通过查看几个示例可能最好地理解该过程:
• readAloud([]) 应该返回 []
• readAloud([1,1,1]) 应该返回 [3,1] • readAloud([-1,7]) 应该返回 [1,-1,7]
• readAloud([3,3,8,-10,-10]) 应该返回 [2,-10]
• readAloud([3,1]) 应该返回 [2,1]
def readAloud(lst: List[int]) -> List[int]:
answer:List[int]=[]
l=len(lst)
d=1
for i in range(l-1):
if(lst[i]==lst[i]):
d = d + 1
answer.append(d)
answer.append(lst[i])
if (lst[i-1] != lst[i]):
d=1
answer.append(d)
answer.append(lst[i])
return answer
解决方法
对相邻元素进行分组正是 itertools.groupby 的用途。
from itertools import chain,groupby
def read_aloud(numbers):
r = ((sum(1 for _ in v),k) for k,v in groupby(numbers))
return list(chain.from_iterable(r))
示例:
>>> read_aloud([])
[]
>>> read_aloud([1,1,1])
[3,1]
>>> read_aloud([3,3,8,-10,-10])
[2,-10]
>>> read_aloud([3,1])
[2,2,1]
,
这里有一个解决方案(但这不是唯一的 :) )
def readAloud(lst):
answer = []
count = 1
prev_elt = lst[0]
for m in lst[1:] + [None]: # we add Node for the last values
if prev_elt == m:
count += 1
else:
answer.extend([count,prev_elt])
prev_elt = m
count = 1
return answer
print(readAloud([3,1]))