Cómo contar caracteres en Python

Mejor respuesta

La pregunta es bastante vaga. Los caracteres, en Python, normalmente están contenidos y procesados ​​en cadenas. La función len () (incorporada) devuelve la longitud de la mayoría de los contenedores en Python (incluidas las cadenas). Así que ese es un tipo de «recuento».

Si desea contar las ocurrencias de cada carácter por separado, para generar datos de histograma, por ejemplo, puede crear un diccionario, mapeando cada carácter a su recuento, iterando sobre las cadenas o el texto y actualizando los valores del diccionario a medida que avanza. O simplemente puede usar una instancia de la clase Counter para el módulo colecciones en el estándar bibliotecas.

from collections import Counter

counts = Counter(somestring)

# counts now contains a dictionary like mapping of item counters

counts.update(morestuff)

# counts have been updated with new items and additional occurrences of previously

# seen item.

Las instancias de la clase Counter pueden contar cualquier cosa que pueda ser evaluada como iterable de objetos hash.

Si quiere contar los caracteres de alguna otra manera, de acuerdo con otros criterios, tendrá que ser mucho más específico.

Respuesta

Bueno, puede usar len () función, pero le sugiero que vaya y deje ese idioma tan rápido como lo haya ingresado así:

> echo -n "hello world"|python -c "import os; os.system("wc -c")"

11

Jaja, no. Louis Parkes dio una buena respuesta. Pero puedo decirte lo que sucede si llamas a Python:

11263> valgrind python -c "print(len("hello world"))" 2>&1|tail -n15

==31376== HEAP SUMMARY:

==31376== in use at exit: 417,246 bytes in 199 blocks

==31376== total heap usage: 3,324 allocs, 3,125 frees, 3,807,322 bytes allocated

==31376==

==31376== LEAK SUMMARY:

==31376== definitely lost: 0 bytes in 0 blocks

==31376== indirectly lost: 0 bytes in 0 blocks

==31376== possibly lost: 528 bytes in 1 blocks

==31376== still reachable: 416,718 bytes in 198 blocks

==31376== suppressed: 0 bytes in 0 blocks

==31376== Rerun with --leak-check=full to see details of leaked memory

==31376==

==31376== For counts of detected and suppressed errors, rerun with: -v

==31376== Use --track-origins=yes to see where uninitialised values come from

==31376== ERROR SUMMARY: 529 errors from 43 contexts (suppressed: 0 from 0)

Vas a desperdiciar 3,8 MB de RAM con solo llamarlo.

> valgrind lua5.2 -e "print(#"hello world")" 2>&1|tail -n15

==32388== Memcheck, a memory error detector

==32388== Copyright (C) 2002-2017, and GNU GPL"d, by Julian Seward et al.

==32388== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info

==32388== Command: lua5.2 -e print(#"hello\ world")

==32388==

11

==32388==

==32388== HEAP SUMMARY:

==32388== in use at exit: 0 bytes in 0 blocks

==32388== total heap usage: 305 allocs, 305 frees, 34,487 bytes allocated

==32388==

==32388== All heap blocks were freed -- no leaks are possible

==32388==

==32388== For counts of detected and suppressed errors, rerun with: -v

==32388== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

34 kb, esa es una leve diferencia para hacer lo mismo. Factor 100. Y esto es cada vez peor cuanto más grandes se vuelven sus proyectos. Y todavía no mencioné el tamaño de las bibliotecas compartidas, que son … enormes y tantas como una legión. Python hace más o menos lo mismo que LuaJIT pero es 30 veces más lento. Habría usado valgrind en LuaJIT pero hay un error de valgrind conocido que falla en LuaJIT, así que tomé 5.2. Pero no hay mucha diferencia. Y no empiezo a detallar las drásticas fugas de memoria que son oficiales en Python y no sobre los cientos de megabytes que se cargan como bibliotecas del sistema para eso y que permanecerán residentes en su sistema.

Los tiempos de inicio también son mucho más lentos con Python, estoy hablando de un factor de más de 10 veces, lo que se vuelve doloroso si tiene muchos pequeños scripts ejecutándose en su sistema operativo que algún genio hizo en Python y eso se ralentiza. el tiempo de arranque por factor 10. No estoy impresionado por eso, se puede imaginar. Aprende algo mejor, no desperdicies tu talento en eso si tu profesor o profesor no te obliga a usarlo.

No digo: aprende Lua. Me refiero a que funciona para mí, pero no soy tú. Solo digo, aprende algo más. Cualquier cosa en realidad. Simplemente no los promocionados como Julia, Go, Haskell o vade retro satanas Java. Aún así, todos son mejores que Python. Solo hay un lenguaje peor que Python y ese sería Ruby, que es solo un poco peor que Malbolge. Si un lenguaje se las arregla para ser más lento que Python, hay algo seriamente mal en él y los desarrolladores cagan en todo lo que incluso desde lejos apesta a eficiencia. La peor codificación en ese idioma, en serio, no tengo idea de cómo lograron hacer que sus cosas fueran tan lentas, ¿tal vez le prestaron algo de poder de cómputo a un minero de bitcoin en segundo plano? No tengo ni idea.

Así que piénselo dos veces.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *