首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >计算连续重复次数

计算连续重复次数
EN

Stack Overflow用户
提问于 2022-08-25 14:16:45
回答 1查看 71关注 0票数 0

我有一个要素清单:

代码语言:javascript
运行
复制
list = ['green','green','red','blue','red','blue','yellow','white','black','yellow','white','black','red','green','yellow','black']

我想对连续的重复进行分组,不管它们的大小。这意味着这是我想要的输出。

代码语言:javascript
运行
复制
['green x2','red-blue-x2','yellow-white-black x2','red,'green','yellow','black']

我只能用js实现部分功能,下面是代码:

代码语言:javascript
运行
复制
let sentence = ""
let index = 0
let repetition_count = 1
let repetition_list = []
list.forEach(element => {
    let prev_elem = list[index-1]
    if(element == prev_elem)
        {
            repetition_count++
            repetition_list.push(element)
        }
    else if(repetition_count>1){
            if(sentence.endsWith(repetition_list[0]+"-")){
                sentence = remove_last_word(sentence)
            }
            sentence+= repetition_list[0] + "x"+repetition_count+"-"
            repetition_count = 1
            repetition_list = []
        }
        sentence+= element+"-"
        index++;
    }

通过对上述代码进行一些调整,它产生了以下输出:

代码语言:javascript
运行
复制
['green x2','red','blue','red','blue','yellow','white','black','yellow','white','black','red,'green','yellow','black']

现在我不知道如何检查多个元素是否重复。

我尝试在python中使用groupby (迭代工具)来理解列表,但是它没有做比JS代码做得更多的事情。

PYTHON代码

代码语言:javascript
运行
复制
grouped_sentence = [(k, sum(1 for i in g)) for k, g in groupby(list)]

它给了我这个输出:

[ ('green',2),('red',1),('blue',1),('red',1),('blue',1),('yellow',1),('white',1),('black',1),('yellow',1),('white',1),('black',1),('red',1),('green',1),('yellow',1),('black',1)]

有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 2022-08-25 15:42:01

首先,这是一个有趣的心理锻炼,所以谢谢你。

此函数将检查数组是否重复,以达到最大分组大小。

代码语言:javascript
运行
复制
function getRepeats(list, maxgroupingsize) {
    var temparray = [...list];
    // iterate through each grouping size
    for (var grpcounter = maxgroupingsize; grpcounter > 0; --grpcounter) {
        // iterate through the array
        for (var pos = 0; pos < temparray.length - grpcounter + 1; ++pos) {
            if (temparray[pos] == "") {continue;}
            // create a current selection string
            var myselection = "";
            for (var selectionbuild = 0; selectionbuild < grpcounter; ++selectionbuild) {
                if (myselection != "") { myselection += "-"; }
                myselection += temparray[pos + selectionbuild]
            }
            var matches = 0;
            // iterate through the array forward looking for matches
            for (var checkpos = pos + grpcounter; checkpos < temparray.length - grpcounter + 1; ++checkpos) {
                // create a test selection string
                var testselection = "";
                for (var selectionbuild = 0; selectionbuild < grpcounter; ++selectionbuild) {
                    if (testselection != "") { testselection += "-"; }
                    testselection += temparray[checkpos + selectionbuild];
                }
                // test to see if the selections match
                if (testselection === myselection) {
                    ++matches;
                    // empty out the array values that we matched
                    for (var cleancounter = 0; cleancounter < grpcounter; ++cleancounter) {
                        temparray[checkpos + cleancounter] = "";
                    }
                    checkpos += grpcounter - 1;
                } else {
                    break;
                }
            }
            // if we had matches, update the current array value
            if (matches > 0) {
                myselection += " x" + (matches + 1);
                checkpos += ((matches + 1) * grpcounter)
                temparray[pos] = myselection;
                for (var cleancounter = 1; cleancounter < grpcounter; ++cleancounter) {
                    temparray[pos + cleancounter] = "";
                }
            }
        }
    }
    
    // create a new array without empty values
    var myresult = [];
    for (var counter = 0; counter < temparray.length; ++counter) {
        if (temparray[counter] != "") { myresult.push(temparray[counter]); }
    }
    
    // return the result
    return myresult;
}

你可以这样称呼它:

代码语言:javascript
运行
复制
var result = getRepeats(mylist, 3);

其中mylist是您的数组,3意味着它将检查最多3个元素长的组。

以下数组:

代码语言:javascript
运行
复制
[ "red", "orange", "orange", "orange", "yellow", "green", "blue", "green", "blue", 
"green", "blue", "orange", "orange", "red", "yellow", "yellow", "indigo", "violet", 
"red", "green", "violet", "red", "green", "violet", "red", "green", "violet", "orange", 
"red", "indigo", "indigo", "indigo", "orange" ]

返回:

代码语言:javascript
运行
复制
[ "red", "orange x3", "yellow", "green-blue x3", "orange x2", "red", "yellow x2", 
"indigo", "violet-red-green x3", "violet", "orange", "red", "indigo x3", "orange" ]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73489148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档