Jak liczyć znaki w Pythonie


Najlepsza odpowiedź

Pytanie jest raczej niejasne. Znaki w Pythonie są zwykle zawarte i przetwarzane w łańcuchach. Funkcja len () (wbudowana) zwraca długość większości dowolnego kontenera w Pythonie (w tym ciągów znaków). To jest jeden rodzaj „licznika”.

Jeśli chcesz policzyć wystąpienia każdego znaku osobno, na przykład w celu wygenerowania danych histogramu, możesz zbudować słownik, mapując każdy znak na liczbę, iterując nad napisami lub tekstem i aktualizując wartości słownika na bieżąco. Lub możesz po prostu użyć wystąpienia klasy Counter dla modułu collections w standardzie biblioteki.

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.

Wystąpienia klasy Counter mogą liczyć wszystko, co może zostać ocenione jako iterowalne obiekty z możliwością mieszania.

Jeśli masz zamiar liczyć znaki w inny sposób, zgodnie z innymi kryteriami, musisz być bardziej szczegółowy.

Odpowiedź

Cóż, możesz użyć len () ale sugeruję, abyś zostawił ten język tak szybko, jak wprowadziłeś go w ten sposób:

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

11

Haha, nie. Louis Parkes zrobił dobrą odpowiedź. Ale mogę ci powiedzieć, co się stanie, jeśli zadzwonisz do Pythona:

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)

Zmarnujesz 3,8 MB pamięci RAM na samo wywołanie.

> 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, to „niewielka” różnica w robieniu tego samego. Czynnik 100. A to jest coraz gorsze, im większe będą twoje projekty. I nie wspomniałem jeszcze o wielkości bibliotek współdzielonych, które są… ogromne, a ich liczba to legion. Python robi mniej więcej to samo co LuaJIT, ale jest 30 razy wolniejszy. Użyłbym valgrind na LuaJIT, ale jest znany błąd valgrind, który wywala się na LuaJIT, więc wybrałem 5.2. Ale nie ma dużej różnicy. I nie zaczynam mówić o drastycznych wyciekach pamięci, które są oficjalne w Pythonie, a nie o setkach megabajtów, które są ładowane jako biblioteki systemowe i pozostaną w twoim systemie.

Czas uruchamiania jest również znacznie wolniejszy w Pythonie, mówię o współczynniku ponad 10 razy, co staje się bolesne, jeśli masz dużo małych skryptów uruchomionych w systemie operacyjnym, które jakiś „ geniusz zrobił w Pythonie i spowalnia czas rozruchu według współczynnika 10. Nie jestem pod wrażeniem, możesz sobie wyobrazić. Naucz się czegoś lepszego, nie marnuj na to swojego talentu, jeśli nie jesteś zmuszony go wykorzystać przez swojego profesora lub nauczyciela.

Nie mówię: naucz się Lua. To znaczy działa dla mnie, ale nie jestem tobą. Po prostu mówię, naucz się czegoś innego. Cokolwiek, naprawdę. Po prostu nie takie hipnotyzujące jak Julia, Go, Haskell czy vade retro satanas Java. Mimo to wszystkie są lepsze niż Python. Jest tylko jeden język gorszy od Pythona i byłby nim Ruby, który jest tylko odrobinę gorszy niż Malbolge. Jeśli jakiś język jest wolniejszy niż Python, jest w nim coś poważnego, a programiści srają na wszystko, co nawet z daleka śmierdzi wydajnością. Najgorsze w historii kodowanie w tym języku, naprawdę nie mam pojęcia, jak udało im się tak powolnie pracować, może pożyczyli część mocy obliczeniowej górnikowi bitcoinów w tle? Nie mam pojęcia.

Więc pomyśl dwa razy.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *