web-dev-qa-db-ja.com

Pythonでアルファベットのディクテーションを生成する高速な方法はありますか?

アルファベットの文字をキーにして、次のような辞書を生成したい

letter_count = {'a': 0, 'b': 0, 'c': 0}

私が入力しなければならないのではなく、そのディクテーションを生成する高速な方法は何でしょうか?

ご協力いただきありがとうございます。

編集
あなたの解決策をみんなに感謝します:)

nosklo'ssolution はおそらく最短です

また、Python string モジュールについて思い出させてくれてありがとう。

34
Nope

私はこのソリューションがよりエレガントであると思います:

import string
d = dict.fromkeys(string.ascii_lowercase, 0)
59
nosklo
import string
letter_count = dict(Zip(string.ascii_lowercase, [0]*26))

または多分:

import string
import itertools
letter_count = dict(Zip(string.lowercase, itertools.repeat(0)))

あるいは:

import string
letter_count = dict.fromkeys(string.ascii_lowercase, 0)

Dictに必要な実際の値によっては、推奨されるソリューションは異なる場合があります。


ここで推測してみましょう。テキスト(または同様のもの)内の文字の出現をカウントしますか?これを行うには、初期化された辞書から始めるよりも良い方法があります。

Counterモジュールのcollectionsを使用:

>>> import collections
>>> the_text = 'the quick brown fox jumps over the lazy dog'
>>> letter_counts = collections.Counter(the_text)
>>> letter_counts
Counter({' ': 8, 'o': 4, 'e': 3, ... 'n': 1, 'x': 1, 'k': 1, 'b': 1})
11
user3850

カウントに使用する場合は、次のことをお勧めします。

import collections
d = collections.defaultdict(int)
8
Kamil Kisiel

list comprehension を使用したコンパクトバージョンを以下に示します。

>>> import string
>>> letter_count = dict( (key, 0) for key in string.ascii_lowercase )
>>> letter_count
{'a': 0, 'c': 0, 'b': 0, 'e': 0, 'd': 0, 'g': 0, 'f': 0, 'i': 0, 'h': 0, 'k': 0,
 'j': 0, 'm': 0, 'l': 0, 'o': 0, 'n': 0, 'q': 0, 'p': 0, 's': 0, 'r': 0, 'u': 0, 
't': 0, 'w': 0, 'v': 0, 'y': 0, 'x': 0, 'z': 0}
8

さらに別の1行Pythonハック:

letter_count = dict([(chr(i),0) for i in range(97,123)])
5
Jeff Bauer

これもあります:

import string
letter_count = dict((letter, 0) for letter in string.ascii_lowercase)
3
recursive

辞書内包表記で非常に簡単:{chr(i+96):i for i in range(1,27)}生成:

_{'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4, 'g': 7, 'f': 6, 'i': 9, 'h': 8, 'k': 11, 'j': 10, 'm': 13, 'l': 12, 'o': 15, 'n': 14, 'q': 17, 'p': 16, 's': 19, 'r': 18, 'u': 21, 't': 20, 'w': 23, 'v': 22, 'y': 25, 'x': 24, 'z': 26}_

chr(i+64)を使用して、Capital A-Zに対して同じものを生成できます。

2
user10084443
import string
letters = string.ascii_lowercase
d = dict(Zip(letters, [0]*len(letters))
2
jfs

私の変種:

注:Unicodeの範囲A-Z => 65-90(10進数)

d = dict.fromkeys([chr(j) for j in range(65, 90)], 0)
print(d)

出力:

>>> {'A': 0, 'B': 0, 'C': 0, 'D': 0, 'E': 0, 'F': 0, 'G': 0, 'H': 0, 'I': 0, 'J': 0, 'K': 0, 'L': 0, 'M': 0, 'N': 0, 'O': 0, 'P': 0, 'Q': 0, 'R': 0, 'S': 0, 'T': 0, 'U': 0, 'V': 0, 'W': 0, 'X': 0, 'Y': 0}
0
Cortek29

辞書と範囲を直接使用できるため、独自の関数を作成して簡単にカスタマイズできます。

def gen_alphabet(start, value):
    return {chr(ord('a') + i) : 0 for i in range(value)}

print(gen_alphabet('a', 26))

出力:

>>> {'a': 0, 'c': 0, 'b': 0, 'e': 0, 'd': 0, 'g': 0, 'f': 0, 'i': 0, 'h': 0, 'k': 0, 'j': 0, 'm': 0, 'l': 0, 'o': 0, 'n': 0, 'q': 0, 'p': 0, 's': 0, 'r': 0, 'u': 0, 't': 0, 'w': 0, 'v': 0, 'y': 0, 'x': 0, 'z': 0}
0
Kevin Sabbe