Cum se numără caractere în Python

Cel mai bun răspuns

Întrebarea este destul de vagă. Caracterele, în Python, sunt în mod normal conținute și procesate în șiruri. Funcția len () (încorporat) returnează lungimea majorității oricărui container din Python (inclusiv șiruri). Deci, acesta este un fel de „numărare”.

Dacă doriți să numărați separat aparițiile fiecărui caracter, pentru a genera date de histogramă, de exemplu, puteți construi un dicționar, mapând fiecare caracter la numărul dvs., iterând peste șiruri sau text și actualizarea valorilor dicționarului pe măsură ce mergeți. Sau puteți utiliza doar o instanță a clasei Counter pentru modulul din standard biblioteci.

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.

Instanțele clasei Counter pot număra orice poate fi evaluat ca un iterabil de obiecte lavabile.

Dacă vrei să numere caractere într-o altă manieră, în conformitate cu alte criterii, va trebui să fii mult mai specific.

Răspuns

Ei bine, poți folosi len () funcție, dar vă sugerez să mergeți și să lăsați limba respectivă la fel de repede pe cât ați introdus-o astfel:

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

11

Haha, nah. Louis Parkes a răspuns bine. Dar vă pot spune ce se întâmplă dacă apelați 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)

Veți pierde 3,8 mb de RAM doar pentru apelare.

> 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, aceasta este o „ușoară” diferență pentru a face același lucru. Factorul 100. Și acest lucru este din ce în ce mai rău cu cât proiectele tale vor deveni mai mari. Și nu am menționat încă dimensiunea bibliotecilor partajate, care sunt … imense și multe ca legiune. Python face mai mult sau mai puțin la fel ca LuaJIT, dar este de 30 de ori mai lent. Aș fi folosit valgrind pe LuaJIT, dar există un bug valgrind cunoscut care se blochează pe LuaJIT, așa că am luat 5.2. Dar nu există prea multă diferență. Și nu încep să aprofundez scurgerile drastice de memorie care sunt oficiale în Python și nu despre sutele de megaocteți care se încarcă ca biblioteci de sistem pentru asta și care vor rămâne rezidente în sistemul dvs.

Timpii de pornire sunt, de asemenea, mult mai încet cu Python, vorbesc despre un factor de peste 10 ori, care devine dureros dacă aveți o mulțime de scripturi mici care rulează în sistemul dvs. de operare pe care unele „genii” le-au făcut în Python și care încetinesc timpul de pornire după factorul 10. Nu mă impresionează acest lucru, vă puteți imagina. Învață ceva mai bun, nu-ți irosi talentul dacă nu ești forțat să-l folosești de profesor sau profesor.

Nu spun: învață Lua. Adică funcționează pentru mine, dar nu sunt tu. Spun doar, învață altceva. Orice, într-adevăr. Doar nu cele hyped precum Julia, Go, Haskell sau vade retro satanas Java. Totuși, toți sunt mai buni decât Python. Există un singur limbaj mai rău decât Python și ar fi Ruby, care este doar un pic mai rău decât Malbolge. Dacă o limbă reușește să fie mai lentă decât Python, este ceva grav în neregulă, iar dezvoltatorii se descurcă în tot ceea ce, chiar și de departe, pare eficiență. Cea mai proastă codificare realizată vreodată în această limbă, nu am în mod serios nici o idee despre cum au reușit să-și facă lucrurile atât de lente, poate împrumută o parte din puterea de calcul unui miner bitcoin în fundal? Nu am idee.

Deci, gândiți-vă de două ori.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *