微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

按数字计算数字在列表编号中重复的次数

如何解决按数字计算数字在列表编号中重复的次数

考虑第一个数字,比如 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]))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。