Переписать частоту строки как понимание - PullRequest
0 голосов
/ 31 октября 2018

Следующий фрагмент процедурного кода вычисляет частоту символов текстовой строки и записывает ее в словарь. Словарь содержит символы в качестве ключей и частоту в качестве значений.

text = "asampletextstring"
char_count = {}
for char in text:
    if char_count.get(char):
        char_count[char] += 1
    else:
        char_count[char] = 1

У меня вопрос: можно ли переписать приведенный выше фрагмент как comprehension?

Ответы [ 4 ]

0 голосов
/ 31 октября 2018

Переписать - не очень, я не вижу простого пути. Лучшее, что я прибыл, требует дополнительного словаря.

d = {}
{ c: d.get(c, 0)  for c in text if d.update( {c: d.get(c,0) + 1} ) or True}

Можно будет получить однострочник в Python 3.8, но (ab) используя выражения присваивания

0 голосов
/ 31 октября 2018

Можно использовать set() здесь, чтобы избежать встречи с персонажем 2 или более раз.

text = "asampletextstring"
dict1 = {ch: text.count(ch) for ch in set(text)}

print(dict1)
{'s': 2, 'r': 1, 'i': 1, 'n': 1, 'a': 2, 'e': 2, 'p': 1, 't': 3, 'x': 1, 'l': 1, 'g': 1, 'm': 1}
0 голосов
/ 31 октября 2018

Мне было любопытно посмотреть на эффективность различных подходов и доказать, что понимание не очень хорошо каждый раз, когда я проводил некоторый анализ с использованием словарного понимания, словарного преобразования путем преобразования входных данных в наборы и традиционные для циклов. Имеет смысл, почему понимание здесь дорого, поскольку .count() повторяется по всему text каждый раз, чтобы подсчитать частоту одиночного char

from timeit import timeit

print('Approach 1 without set compehrension: {}'.format(timeit ('{ch: text.count(ch) for ch in text}',setup='text = "asampletextstring"',number=1000000)))
print('Approach 2 with set compehrension: {}'.format(timeit ('{ch: text.count(ch) for ch in set(text)}',setup='text = "asampletextstring"',number=1000000)))
print('Approach 3 simple loops :{}'.format(timeit('for c in text:char_count[c] = char_count.get(c, 0) + 1',setup='text = "asampletextstring";char_count={};',number=1000000)))
print('Approach 4 Counter :{}'.format(timeit('Counter(text)',setup='text = "asampletextstring";from collections import Counter;',number=1000000)))

Выход:

Approach 1 without set compehrension: 4.43441867505
Approach 2 with set compehrension: 3.98101747791
Approach 3 simple loops :2.60219633984
Approach 4 Counter :7.54261124884
0 голосов
/ 31 октября 2018

Возможно, но неэффективно :

text = "asampletextstring"

char_count = { char : text.count(char) for char in text }

print(char_count)

выход

{'s': 2, 'x': 1, 'p': 1, 'm': 1, 'e': 2, 'r': 1, 'n': 1, 'g': 1, 'a': 2, 'i': 1, 'l': 1, 't': 3}

Вы можете написать более короткую версию своего кода:

char_count = {}
for char in text:
    char_count[char] = char_count.get(char, 0) + 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...