Como contar caracteres em Python

Melhor resposta

A questão é um tanto vaga. Os caracteres, em Python, normalmente estão contidos e são processados ​​em strings. A função len () (embutida) retorna o comprimento da maioria dos contêineres em Python (incluindo strings). Então esse é um tipo de “contagem”.

Se você quiser contar as ocorrências de cada caractere separadamente, para gerar dados de histograma, por exemplo, você poderia construir um dicionário, mapeando cada caractere para sua contagem, iterando sobre as strings ou texto e atualizando os valores do dicionário conforme você avança. Ou você pode apenas usar uma instância da classe Contador para o módulo coleções no padrão 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.

As instâncias da classe Counter podem contar qualquer coisa que possa ser avaliada como um iterável de objetos hashable.

Se você pretende contar caracteres de alguma outra maneira, de acordo com alguns outros critérios, você terá que ser muito mais específico.

Resposta

Bem, você pode usar o len () mas sugiro que você vá e deixe esse idioma tão rápido quanto o inseriu, desta forma:

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

11

Haha, nah. Louis Parkes deu uma boa resposta. Mas posso dizer o que acontece se você chamar 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)

Você vai perder 3,8 MB de RAM apenas para chamá-lo.

> 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, que é uma ligeira diferença para fazer o mesmo. Fator 100. E isso está ficando cada vez pior quanto maiores se tornarão seus projetos. E ainda não mencionei o tamanho das bibliotecas compartilhadas, que são … enormes e numerosas. Python faz mais ou menos o mesmo que LuaJIT, mas é 30 vezes mais lento. Eu teria usado valgrind no LuaJIT, mas há um bug conhecido do valgrind que falha no LuaJIT, então peguei o 5.2. Mas não há muita diferença. E não vou começar a elaborar sobre os drásticos vazamentos de memória que são oficiais em Python e não sobre as centenas de megabytes que são carregados como bibliotecas de sistema para isso e que permanecerão residentes em seu sistema.

Os tempos de inicialização também são muito mais lentos com Python, estou falando de um fator de mais de 10 vezes, o que se torna doloroso se você tem muitos pequenos scripts em execução em seu sistema operacional que algum gênio fez em Python e que ficam lentos o tempo de inicialização por fator 10. Não estou impressionado com isso, você pode imaginar. Aprenda algo melhor, não desperdice seu talento com isso se você não for forçado a usá-lo por seu professor ou professor.

Eu não digo: aprenda Lua. Quer dizer, funciona para mim, mas eu não sou você. Eu apenas digo, aprenda outra coisa. Qualquer coisa, mesmo. Só não os exagerados como Julia, Go, Haskell ou vade retro satanas Java. Ainda assim, todos eles são melhores do que Python. Existe apenas uma linguagem pior do que Python, que seria Ruby, que é apenas um pouco pior do que Malbolge. Se uma linguagem consegue ser mais lenta que o Python, há algo muito errado nisso e os desenvolvedores cagam em tudo que cheira a eficiência, mesmo vindo de longe. A pior codificação já feita nessa linguagem, eu realmente não tenho ideia de como eles conseguiram deixar suas coisas tão lentas, talvez eles emprestem um pouco do poder de computação para um minerador de bitcoin no fundo? Não tenho ideia.

Então, pense duas vezes.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *