Hogyan lehet megszámolni a karaktereket a Pythonban


Legjobb válasz

A kérdés meglehetősen homályos. A Pythonban szereplő karakterek általában karakterláncokban vannak és feldolgozódnak. Az len () függvény (beépített) a Python bármely tárolójának (beleértve a karakterláncokat is) hosszát adja vissza. Tehát ez egyfajta „számlálás”.

Ha az egyes karakterek előfordulásait külön-külön szeretné megszámolni, például hisztogramadatok létrehozásához, akkor összeállíthat egy szótárat, hozzárendelve az egyes karaktereket a számához, iterálva a karakterláncok vagy a szöveg fölött, és frissíti a szótár értékeit menet közben. Vagy használhatja a Számláló osztály egy példányát a standard gyűjtemények modulhoz könyvtárak.

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.

A Counter osztály példányai bármit megszámolhatnak, ami értékelhető a hashable objektumok iterálhatójaként.

Ha a karakterek valamilyen más módon történő megszámolására, más kritériumok alapján sokkal konkrétabbra kell, hogy mondd.

Válasz

Nos, használhatod a len () funkciót, de azt javaslom, menjen el, és hagyja el ezt a nyelvet, amilyen gyorsan ezt beírta:

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

11

Haha, hát. Louis Parkes jó választ adott. De elmondhatom, mi történik, ha felhívja a Pythont:

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)

3,8 MB RAM-ot pazarol, mert csak hívta.

> 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, ez „enyhe” különbség ugyanannak a végrehajtásához. 100. faktor. És ez egyre rosszabb, minél nagyobbak lesznek a projektjei. És még nem említettem a megosztott könyvtárak méretét, amelyek… hatalmasak és sokak légiósként. A Python nagyjából ugyanazt csinálja, mint a LuaJIT, de 30-szor lassabb. A valgrind-et használtam volna a LuaJIT-en, de van egy ismert valgrind-hiba, amely összeomlik a LuaJIT-en, ezért az 5.2-et vettem. De nincs sok különbség. És nem kezdem el részletezni azokat a drasztikus memóriaszivárgásokat, amelyek hivatalosak a Pythonban, és nem arról a megabájtok százairól, amelyek erre rendszerkönyvtárakként kerülnek betöltésre, és amelyek továbbra is rezidensek maradnak a rendszerben.

Az indítási idők a Python esetében is sokkal lassabbak, 10-szeres tényezőről beszélek, ami fájdalmas lesz, ha sok kicsi szkript fut az operációs rendszeredben, amit néhány zseni tett a Pythonban, és amelyek lelassulnak az indítási idő 10-szeresére. Ez engem nem hat meg, elképzelheted. Tanuljon meg valami jobbat, ne pazarolja erre tehetségét, ha professzora vagy tanára nem kényszeríti rá.

Nem mondom: tanulja meg Lua-t. Mármint nekem dolgozik, de nem én vagyok. Csak azt mondom, tanulj meg mást. Bármi, tényleg. Csak nem azok a hipederek, mint Julia, Go, Haskell vagy a Vade retro satanas Java. Mégis mindegyik jobb, mint a Python. Csak egy nyelv van rosszabb, mint a Python, és ez a Ruby lenne, ami csak egy kicsit rosszabb, mint a Malbolge. Ha egy nyelv képes lassabban működni, mint a Python, akkor abban valami komoly baj van, és a fejlesztők mindent elcsesznek, ami még a távolból is szereti a hatékonyságot. A legrosszabb kódolás ezen a nyelven, komolyan nem is sejtem, hogyan sikerült ilyen lassan megszerezni a cuccaikat, esetleg kölcsönadják a számítási teljesítmény egy részét a háttérben lévő bitcoin bányászoknak? Fogalmam sincs.

Tehát gondold át kétszer.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük