Понимание словаря и проверка ключей при создании - PullRequest
1 голос
/ 17 марта 2011

У меня была задача прочитать файл, сохранить каждый символ в dict как ключ и значение приращения для каждого найденного ключа, это привело к коду, подобному этому:

chrDict = {}
with open("gibrish.txt", 'r') as file:
    for char in file.read():
        if char not in chrDict:
            chrDict[char] = 1
        else:
            chrDict[char] += 1

Так что это работает нормально, но для меня, по крайней мере, в Python, это выглядит действительно ужасно. Я пробовал разные способы использования понимания. Есть ли способ сделать это с пониманием? Я пытался использовать locals () во время создания, но это казалось очень медленным, плюс, если я правильно понял, локальные объекты включали бы все в область, в которой было запущено понимание, что усложняло ситуацию.

Ответы [ 3 ]

7 голосов
/ 17 марта 2011

В Python 2.7 , вы можете использовать Counter:

from collections import Counter

with open("gibrish.txt", 'r') as file:
    chrDict = Counter(f.read())
4 голосов
/ 17 марта 2011

Использовать defaultdict:

from collections import defaultdict

chr_dict = defaultdict(int)
with open("gibrish.txt", 'r') as file:
    for char in file.read():
        chr_dict[char] += 1

Если вы действительно хотите использовать списочные выражения, вы можете использовать этот неэффективный вариант:

text = open("gibrish.txt", "r").read()
chr_dict = dict((x, text.count(x)) for x in set(text))
0 голосов
/ 03 августа 2015

Метод словаря get () вернет вам значение, если оно существует, или же 0.

chrDict = {}
with open("gibrish.txt", 'r') as file:
   for char in file.read():
        chrDict[char] = chrDict.get(char, 0) + 1
...