Реализация алгоритма Misra & Gries в python - PullRequest
0 голосов
/ 14 января 2019

У меня есть этот псевдокод:

A = empty associative array;
// Processing
while ( not end of sequence ) #referente ao data stream
     j = current_token();
     if ( j in keys(A) ) then A[ j ] = A[ j ] + 1;
     else if ( | keys(A) | < ( k – 1 ) ) then A[ j ] = 1;
     else for each i in keys(A) do
         A[ i ] = A[ i ] – 1;
         if ( A[ i ] == 0 ) then remove i from A;
// Output
if( a in keys(A) ) then freq_estimate = A[ a ];
else freq_estimate = 0;

Я реализую так:

def contMisraGries(dataClean, k):
    frequencia_MisraGries = {}
    A={}

    for caracter in dataClean:
        if  caracter in A.keys():
            A = increment(caracter, A)
        else:
            if A.keys() < k-1:
                A.keys(caracter) = 1
            else:
                for i , v in A.items():
                    A.keys(i) -= 1
                    if v == 0:
                        del A.items(i)

    for car, val in A.items() :
        if car in frequencia_MisraGries.keys():
            frequencia_MisraGries.keys(car) = frequencia_MisraGries.values(val) 
        else:
            frequencia_MisraGries.keys(car) = 0

    return frequencia_MisraGries

def increment(caracter, A):
    for k, v in A.items():
        if k == caracter:
            A[k]=A[v]+1

    return A

Очистка данных - это список, подобный следующему:

['o','n','c','e','y','o',...]

Значение k передается пользователю программы.

Но код не компилируется. У меня ошибка в этой строке A.keys(caracter) = 1. Я не знаю, правильно ли я понимаю код.

1 Ответ

0 голосов
/ 14 января 2019

Похоже, вы пытаетесь получить доступ к содержимому словаря с помощью ключа. Однако обратите внимание, что метод keys() не принимает аргументов, как в документации , что он делает:

Этот метод возвращает список всех доступных ключей в словаре.

Если вы хотите получить доступ к содержимому словаря по его ключу, выполните A[caracter].

Пример

d = {'a':3, 'b':4}

Использование метода ключей:

d.keys()
dict_keys(['a', 'b'])

Теперь, то, что вы пытаетесь сделать, вызовет ошибку:

d.keys('a')

TypeError: keys () не принимает аргументов (задано 1)

Вместо этого:

d['a']
3

Подробнее о Доступ к значениям в словаре в привязанной ссылке.

...