返回频率的元组列表,我哪里做错了?

2024-10-02 22:38:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须做一个练习,要求我做一个函数,找到列表中连续值的频率,并返回一个元组列表,在这个列表中我必须显示重复的次数

输入:

[1, 1, 1, 3, 5, 1, 1, 3, 3]

输出:

[(1,3) , (3,1) , (5,1) , (1,2) , (3,2)]

代码:

def empaquetar(l):

lista = []
for i in range(len(l)-1):
    cont = 0
    j = i + 1
    while l[i] == l[j] and j<len(l)-1:
        cont += 1
        i += 1
        j += 1
    if cont > 0:
        lista.append((l[i], cont + 1))
    else:
        lista.append((l[i],1))
return lista

嗯,我写的东西并没有完全返回我想要的,我也找不到解决方案,但我搜索了很多,比如集合中的工具计数器之类的东西。我需要帮助,有什么建议吗


Tags: 函数代码in列表forlendefrange
3条回答

为此,我开发了一个时间复杂度为O(n)的算法

def consecutive(lst):
    lst.append(0)

    count = 1
    result = []

    for i, value in enumerate(lst):
        if value == lst[min(len(lst) - 1, i + 1)]:
            count += 1
        else:
            result.append((value, count))
            count = 1

    return result

结果

让我们为这个函数尝试几个测试用例

>>> lst = [1, 1, 1, 3, 5, 1, 1, 3, 3]
>>> consecutive(lst)

[(1, 3), (3, 1), (5, 1), (1, 2), (3, 2)]

下面是验证代码的另一个测试用例

>>> lst = [1, 2, 5, 5, 3, 2, 2, 1]
>>> consecutive(lst)

[(1, 1), (2, 1), (5, 2), (3, 1), (2, 2), (1, 1)]
from itertools import groupby
lista = [group[0], len(list(group[1])) for group in groupby(l)]

没有经过彻底的测试,但这里有一个尝试

prev_val = None
counter = 1
for curr_val in input_list:
    if prev_val is not None:
        if prev_val != curr_val:
            output_list.append((prev_val, counter))
            counter = 1
        else:
            counter += 1
            
    prev_val = curr_val
            
output_list.append((prev_val, counter))
print (output_list)

相关问题 更多 >