【问题标题】:Returning a list of tuples of frequency, where did I do wrong?返回频率元组的列表,我在哪里做错了?
【发布时间】:2021-12-10 14:45:45
【问题描述】:

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

输入:

[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

好吧,我写的内容并没有完全返回我想要的内容,我找不到解决方案,但我搜索了很多,例如来自集合的工具 Counter 或类似的东西。我需要帮助,有什么建议吗?

【问题讨论】:

    标签: python list algorithm tuples


    【解决方案1】:

    没有经过全面测试,但这里是一个尝试

    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)
    

    【讨论】:

      【解决方案2】:
      from itertools import groupby
      lista = [group[0], len(list(group[1])) for group in groupby(l)]
      

      【讨论】:

        【解决方案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)]
        

        【讨论】:

          【解决方案4】:

          使用第二个 for 循环检查该数字连续出现的次数。

          def empaquetar(l):
          
          lista = []
          for i in l:
              cont = 1
              for j in range(i+1, len(l)):
                If l[j]==i:
                  cont += 1
                else:
                  break
            lista.append((i, cont))
          
          return lista
          

          【讨论】:

          • 但该代码没有返回我的输出
          猜你喜欢
          • 2021-12-15
          • 2015-03-21
          • 2022-01-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多