Últimas actualizaciónes:
Cómo contar la repetición de elementos en una lista, online

Cómo contar la repetición de elementos en una lista, online

— O —
— O — Herramientas

En ocasiones pienso que existe en Internet una herramienta para cada problema que necesitamos resolver ["está todo inventado", solía decir mi abuelo]. Aunque posiblemente estoy exagerando, mi experiencia me dice que 8 de cada 10 veces que busco una herramienta online para hacer algo especifico, ésta existe. 

Hoy te voy a mostrar una de esas herramientas que, en principio, te puede parecer que resuelve un problema anodino pero, sin embargo, como somos tantos de nosotros es muy probable alguien haga uso de la misma.

Tabla de contenidos

Contar elementos repetidos en una lista

Si manejas alguno de los cientos de lenguajes de programación que existen posiblemente te tomes el tiempo para copiar y pegar crear un programa que cuente los elementos repetidos en una lista. Si sos el rey de Excel o Google Sheets [dale una mirada a Libre Office que vale la pena], es muy probable que puedas resolver el problema de contar repetidos con alguna formula loca o similar. 

Pero, si no podes hacer nada de lo mencionado en el párrafo anterior, o podes pero no queres ocupar tu tiempo en eso, entonces, y solo entonces, quizás esta herramienta es para vos:

contar elementos repetidos en una lista

La herramienta hace lo que dice que hace. Por ejemplo, si tenemos la siguiente lista [Siempre me fue imposible memorizar el abecedario, no sé porque]:

A
B
C
D
E
F
G
H
I
J
K
M
N
L
O
P
Q
R
S
A

Y la copiamos en el textarea del sitio web Contar la repetición de elementos en una lista.

Nos va  mostrar como resultado algo como lo siguiente:

contar elementos repetidos en una lista

Sencillo y funcional. Te dice cuantas repeticiones hay para cada elemento de la lista. 

El resultado también se puede exportar en formato CSV, que puede a ser importado y procesado con Excel, Google Sheets o Libre Office.

contar elementos repetidos en una lista

¿Qué pasa si mi lista contiene información sensible?

Es una buena pregunta y supongo un escenario de uso valido. Respecto a eso, en el sitio se menciona lo siguiente:

"Los datos introducidos en el formulario anterior se procesan del lado del cliente en su navegador web, y nunca se envían o almacenan en ningún otro lugar aparte de su dispositivo."

Y efectivamente comprobamos que así funciona, dado que al momento de presionar el botón "Display/Update Counts" no se envía ningún request al servidor, sino que se invoca a la función updateCounts() encargada de procesar la lista y retornar el resultado. 

Es más, esa función está embebida en un tag script dentro del HTML:

var objCountsPlaceholder = null;
function updateCounts()
{
	formObj = document.forms['lineCounts'];
	textInput = formObj.elements['textInput'];
	objCountsPlaceholder = document.getElementById('CountsPlaceholder');
	
	// Index 0 is the count, 1 is the line
	sortByIndex = 0;
	if(document.getElementById('sortby_line').checked)
	{
		sortByIndex = 1;
	}
	formatSelection = 'readable';
	if(document.getElementById('format_csv').checked)
	{
		formatSelection = 'csv';
	}

	inputString = new String(textInput.value);
	var arrLines = inputString.split("\n");
	var countLines = arrLines.length;
	var arrUniqueLines = [];

	// Loop through lines and accumulate counts
	for(var i = 0; i < countLines; i++)
	{
		// Ignore trailing new-line (if there is one)
		var currentLine = arrLines[i];
		if(currentLine.substr(currentLine.length - 2, 2) == "\r\n")
		{
			currentLine = currentLine.substr(0, currentLine.length - 2);
		}
		if(currentLine.substr(currentLine.length - 1, 1) == "\n" ||
			currentLine.substr(currentLine.length - 1, 1) == "\r")
		{
			currentLine = currentLine.substr(0, currentLine.length - 1);
		}
	
		// Count the lines
		if(!arrUniqueLines[currentLine]) {
			arrUniqueLines[currentLine] = 1;
		} else {
			arrUniqueLines[currentLine] += 1;
		}
	}

	// Delete the counts from previous run
	if(objCountsPlaceholder.hasChildNodes())
	{
    	while(objCountsPlaceholder.childNodes.length >= 1)
	    {
    	    objCountsPlaceholder.removeChild(objCountsPlaceholder.firstChild);
	    }
	}
	
	if(formatSelection == 'csv')
	{
		AppendLine("COUNT,LINE");
	}
	else
	{
		AppendLine("COUNT    | LINE");
		AppendLine("-----------------------------------------------------");
	}
	
	// Sort by count
	var sortedLines = [];
	for(var i in arrUniqueLines)
	{
		sortedLines.push([arrUniqueLines[i], i]);
	}
	arrUniqueLines = null;
	// Reverse sort by count
	sortedLines.sort(function(a,b) {
		if(sortByIndex == 0)
		{
			return (b[0] - a[0] != 0 ? b[0] - a[0] : a[1].localeCompare(b[1]));
		}
		else
		{
			return (a[1].localeCompare(b[1]) != 0 ?a[1].localeCompare(b[1]) : b[0] - a[0]);
		}
	} );

	// Print the line counts
	for(var i in sortedLines)
	{
		if(formatSelection == 'csv')
		{
			AppendLine(sortedLines[i][0] + ',"' + sortedLines[i][1].replace('"', '""') + '"');
		}
		else
		{
			strToPrint = '' + zeroPad(sortedLines[i][0], 8, " ");
			strToPrint += ' | ' + sortedLines[i][1] + '';
			AppendLine(strToPrint);
		}
	}

	// Print total character count
	if(formatSelection == 'csv')
	{
		AppendLine(countLines + ",TOTAL LINES");
	}
	else
	{
		AppendLine("-----------------------------------------------------");
		AppendLine(zeroPad(countLines, 8, " ") + " | TOTAL LINES");
	}
	
	return false;
}

// n = number you want padded
// digits = length you want the final output
function zeroPad(n, digits, padChar) {
	n = n.toString();
	while (n.length < digits) {
		n = padChar + n;
	}
	return n;
}
function AppendLine(str)
{
	objCountsPlaceholder.appendChild(document.createTextNode(str + "\n"));
}

Si te gusta como se ve el código podes hacer lo mismo usando un resaltador de sintaxis online

El resumen, el saludo y la despedida

No hay mucho más que decir. La herramienta cumple lo que promete: contar los elementos repetidos en una lista. Punto. Si necesitas resolver ese problema, puede ser un buen candidato para que pongas esa página en tus bookmarks [y si es en Vivaldi mucho mejor]

Como tenemos la costumbre de agradecer a los creadores de estás utilidades, vamos a saludar y darle las gracias a Shailesh N. Humbad, el desarrollador detrás de esta herramienta y muchas otras que vas a poder encontrar en su muy elegante sitio web: Somacon. 

Shailes Humbad

Estamos en Twitter, aunque parecer que nadie lo sabe: https://twitter.com/tecnolocuras1 🦆

¡Nos vemos! Peace. ✌

 

 

Comentarios