我有一个要素清单:
list = ['green','green','red','blue','red','blue','yellow','white','black','yellow','white','black','red','green','yellow','black']我想对连续的重复进行分组,不管它们的大小。这意味着这是我想要的输出。
['green x2','red-blue-x2','yellow-white-black x2','red,'green','yellow','black']我只能用js实现部分功能,下面是代码:
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++;
}通过对上述代码进行一些调整,它产生了以下输出:
['green x2','red','blue','red','blue','yellow','white','black','yellow','white','black','red,'green','yellow','black']现在我不知道如何检查多个元素是否重复。
我尝试在python中使用groupby (迭代工具)来理解列表,但是它没有做比JS代码做得更多的事情。
PYTHON代码:
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)]
有什么建议吗?
发布于 2022-08-25 15:42:01
首先,这是一个有趣的心理锻炼,所以谢谢你。
此函数将检查数组是否重复,以达到最大分组大小。
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;
}你可以这样称呼它:
var result = getRepeats(mylist, 3);其中mylist是您的数组,3意味着它将检查最多3个元素长的组。
以下数组:
[ "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" ]返回:
[ "red", "orange x3", "yellow", "green-blue x3", "orange x2", "red", "yellow x2",
"indigo", "violet-red-green x3", "violet", "orange", "red", "indigo x3", "orange" ]https://stackoverflow.com/questions/73489148
复制相似问题