Come contare i caratteri in Python

Migliore risposta

La domanda è piuttosto vaga. I caratteri, in Python, sono normalmente contenuti ed elaborati in stringhe. La funzione len () (incorporata) restituisce la lunghezza della maggior parte dei contenitori in Python (comprese le stringhe). Quindi questo è un tipo di “conteggio”.

Se vuoi contare le occorrenze di ogni carattere separatamente, ad esempio per generare i dati dellistogramma, puoi costruire un dizionario, mappando ogni carattere al tuo conteggio, iterando sulle stringhe o sul testo e aggiornando i valori del dizionario man mano che procedi. Oppure puoi semplicemente utilizzare unistanza della classe Counter per il modulo collections nello standard librerie.

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.

Le istanze della classe Counter possono contare tutto ciò che può essere valutato come un iterabile di oggetti hashable.

Se intendi contare i caratteri in qualche altro modo, in base ad altri criteri, dovrai essere molto più specifico.

Risposta

Bene, puoi usare len () ma ti suggerisco di lasciare quella lingua velocemente come lhai inserita in questo modo:

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

11

Haha, nah. Louis Parkes ha fatto una buona risposta. Ma posso dirti cosa succede se chiami 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)

Sprecherai 3,8 MB di RAM solo per chiamarlo.

> 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, è una “leggera” differenza per fare lo stesso. Fattore 100. E questo peggiora sempre di più quanto più grandi diventeranno i tuoi progetti. E non ho ancora menzionato le dimensioni delle biblioteche condivise, che sono … enormi e numerose come una legione. Python fa più o meno lo stesso di LuaJIT ma è 30 volte più lento. Avrei usato valgrind su LuaJIT ma cè un bug noto di valgrind che si blocca su LuaJIT, quindi ho preso 5.2. Ma non cè molta differenza. E non comincio ad approfondire le drastiche perdite di memoria ufficiali in Python e non le centinaia di megabyte che vengono caricate come librerie di sistema per questo e che rimarranno residenti nel tuo sistema.

I tempi di avvio sono anche molto più lenti con Python, sto parlando di un fattore di più di 10 volte, che diventa doloroso se hai molti piccoli script in esecuzione nel tuo sistema operativo che alcuni “ geniali hanno fatto in Python e che rallentano il tempo di avvio del fattore 10. Non ne sono impressionato, puoi immaginare. Impara qualcosa di meglio, non sprecare il tuo talento su questo se non sei costretto a usarlo dal tuo professore o insegnante.

Non dico: impara Lua. Voglio dire, funziona per me, ma non sono te. Dico solo, impara qualcosaltro. Qualunque cosa, davvero. Solo non quelli pubblicizzati come Julia, Go, Haskell o vade retro satanas Java. Eppure sono tutti migliori di Python. Cè solo un linguaggio peggiore di Python e questo sarebbe Ruby, che è solo un po peggiore di Malbolge. Se un linguaggio riesce ad essere più lento di Python, cè qualcosa di seriamente sbagliato e gli sviluppatori cagano su tutto ciò che anche da lontano puzza di efficienza. Peggiore codifica mai in quella lingua, non ho davvero idea di come siano riusciti a ottenere le loro cose così lentamente, forse prestano parte della potenza di calcolo a un minatore di bitcoin in background? Non ne ho idea.

Quindi pensaci due volte.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *