Pythonで文字を数える方法


ベストアンサー

質問はかなりあいまいです。 Pythonの文字は通常、文字列に含まれ、処理されます。 len()関数(組み込み)は、Pythonのほとんどすべてのコンテナー(文字列を含む)の長さを返します。これは一種の「カウント」です。

たとえば、ヒストグラムデータを生成するために、各文字の出現を個別にカウントする場合は、辞書を作成し、各文字をカウントにマッピングして、繰り返します。文字列またはテキストを上書きし、辞書の値を更新します。または、標準のコレクションモジュールのカウンタークラスのインスタンスを使用することもできます。ライブラリ。

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.

Counterクラスのインスタンスは、ハッシュ可能なオブジェクトの反復可能として評価できるものをすべてカウントできます。

If他の方法で文字を数えることを意味します。他の基準に従って、より具体的にする必要があります。

回答

そうですね、len()を使用できます。機能しますが、次のように入力したのと同じ速さでその言語をそのままにしておくことをお勧めします:

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

11

ハハ、いや。 LouisParkesは良い答えをしました。ただし、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)

呼び出すだけで3.8MBのRAMを浪費します。

> 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、これは同じことを行うための「わずかな」違いです。ファクター100。そして、これはますます悪化しており、プロジェクトが大きくなるほど悪化しています。また、共有ライブラリのサイズについてはまだ触れていません。共有ライブラリは…巨大で、非常に多くなっています。 PythonはLuaJITとほぼ同じように動作しますが、30倍遅くなります。 LuaJITでvalgrindを使用したはずですが、LuaJITでクラッシュする既知のvalgrindバグがあるため、5.2を使用しました。しかし、大きな違いはありません。そして、Pythonで公式に行われている劇的なメモリリークについては詳しく説明しません。そのためのシステムライブラリとして読み込まれ、システムに常駐する数百メガバイトについては説明しません。

Pythonでは起動時間もはるかに遅くなります。10倍以上の係数について話しています。これは、一部の「天才」がPythonで実行したような、OSで実行されている小さなスクリプトが多数あり、速度が低下する場合に苦痛になります。起動時間は10倍です。私はそれに感心していません。想像できます。より良いことを学びましょう。教授や教師から強制的に使われなければ、才能を無駄にしないでください。

私は言いません。Luaを学びましょう。私のために働くという意味ですが、私はあなたではありません。私はただ言う、何か他のことを学ぶ。何でも、本当に。 Julia、Go、Haskell、またはvadeのレトロなsatanasJavaのような誇大宣伝されたものではありません。それでも、それらはすべてPythonよりも優れています。 Pythonよりも悪い言語は1つだけで、それはRubyであり、Malbolgeよりも少しだけ悪いです。言語がPythonよりも遅くなることができた場合、それについて何か深刻な問題があり、開発者は効率のような遠いところからでもすべてにたわごとをします。その言語でこれまでで最悪のコーディングでしたが、どうやって彼らが自分たちのものをそれほど遅くすることができたのか真剣にわかりません、多分彼らはバックグラウンドでビットコインマイナーに計算能力の一部を貸しますか?わかりません。

考え直してください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です