Hur man räknar tecken i Python


Bästa svaret

Frågan är ganska vag. Tecken i Python ingår normalt och bearbetas i strängar. Funktionen len () (inbyggd) returnerar längden på de flesta behållare i Python (inklusive strängar). Så det är en typ av ”räkning.”

Om du vill räkna förekomster av varje tecken separat, för att generera histogramdata, till exempel, kan du skapa en ordlista, mappa varje tecken till ditt antal, itera över strängarna eller texten och uppdatera dina ordboksvärden när du går. Eller så kan du bara använda en instans av klassen Counter för samlingar -modulen i standarden bibliotek.

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.

Förekomst av räknarklassen kan räkna allt som kan utvärderas som en iterabel av hash-objekt.

Om du menar att räkna tecken på något annat sätt, enligt vissa andra kriterier måste du vara mycket mer specifik.

Svar

Tja, du kan använda len () funktion men jag föreslår att du går och lämnar det språket så fort du har angett det så här:

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

11

Haha, nej. Louis Parkes gjorde ett bra svar. Men jag kan berätta vad som händer om du ringer till 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)

Du kommer att slösa bort 3,8 MB RAM-minne för att bara kalla det.

> 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, det är en ”liten” skillnad för att göra detsamma. Faktor 100. Och detta blir värre och värre ju större dina projekt kommer att bli. Och jag nämnde inte storleken på de delade biblioteken ännu, som är … enorma och många som legion. Python gör mer eller mindre detsamma som LuaJIT men det är 30 gånger långsammare. Jag skulle ha använt valgrind på LuaJIT men det finns en känd valgrind bug som kraschar på LuaJIT, så jag tog 5.2. Men det är inte så stor skillnad. Och jag börjar inte gå ut på de drastiska minnesläckage som är officiella i Python och inte om de hundratals megabyte som laddas som systembibliotek för det och som kommer att förbli hemma i ditt system.

Starttiderna är också mycket långsammare med Python, jag pratar om en faktor på mer än 10 gånger, vilket blir smärtsamt om du har många små skript som körs i ditt operativsystem som något ”geni” gjorde i Python och som saktar ner starttiden med faktor 10. Jag är inte imponerad av det, kan du föreställa dig. Lär dig något bättre, slösa inte din talang på det om du inte tvingas använda den av din professor eller lärare.

Jag säger inte: lär dig Lua. Jag menar fungerar för mig, men jag är inte du. Jag säger bara, lär dig något annat. Vad som helst egentligen. Bara inte de hypade som Julia, Go, Haskell eller vade retro satanas Java. Ändå är alla bättre än Python. Det finns bara ett språk värre än Python och det skulle vara Ruby, vilket bara är lite värre än Malbolge. Om ett språk lyckas vara långsammare än Python, är det något som är allvarligt fel med det och utvecklarna skiter på allt som till och med långt stinker av effektivitet. Värsta kodningen någonsin på det språket, jag har på allvar ingen aning om hur de lyckades få sina saker så långsamma, kanske lånar de ut en del av datorkraften till en bitcoin-gruvarbetare i bakgrunden? Jag har ingen aning.

Så tänk två gånger.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *