Сравнение двух разных счетчиков Python - PullRequest
0 голосов
/ 14 сентября 2018

Я работаю над алгоритмом в Python, который будет принимать пользовательский ввод и сообщать им, какие новые буквы им нужно будет добавить в строку, чтобы превратить ее в другую строку, и я много играл ссловари, созданные методом Counter.

Я хочу сравнить два разных словаря, которые считают буквы из строк (например, объекты, возвращенные при использовании инструмента Counter из модуля коллекций).Мы можем назвать эти словари D1 и D2.Я хочу, чтобы было два полученных словаря (R1 и R2), первый - это общие буквы между двумя, а второй - буквы, необходимые для превращения R1 в R2 (буквы, которые находятся в D2, но не в D1).

Например:

# assuming they’ve been converted from counter objects into regular 
dictionaries #

D1 = {‘A’: 2, ‘B’: 1, ‘C’: 4, ‘D’: 5}
D2 = {‘A’: 3, ‘B’: 4, ‘C’ : 4, ‘D’: 7}

# Some sort of comparison function executed here #

Результат:

R1={‘A’: 2, ‘B’: 3, ‘C’: 4, ‘D’: 5} 
R2 = {‘A’: 1, ‘B’: 1, ‘C’: 0 , ‘D’: 2} 

Ответы [ 4 ]

0 голосов
/ 06 апреля 2019
IntersectCounter=[]
for each in D1:
        if D1[each]==D2[each]:
              IntersectCounter.append(each)

это дает общее содержимое на счетчиках D1 и D2

0 голосов
/ 14 сентября 2018

Эти операции уже встроены в тип счетчика:

Несколько математических операций предоставлено для объединения объектов Counter для создания мультимножеств (счетчиков, число которых больше нуля). Сложение и вычитание объединяют счетчики путем сложения или вычитания количества соответствующих элементов. Пересечение и объединение возвращают минимум и максимум соответствующих отсчетов.

(цитата из Python collections.Counter документы .)

Итак, если D1 и D2 - Счетчики, попробуйте

R1 = D1 & D2
R2 = D2 - R1
0 голосов
/ 14 сентября 2018

Если под общими буквами вы имеете в виду пересечение Счетчик, вы можете использовать оператор &, а количество букв, необходимое для преобразования R1 в R2, можно рассматривать как разницу:

from collections import Counter

D1 = Counter({'A': 2, 'B': 1, 'C': 4, 'D': 5})
D2 = Counter({'A': 3, 'B': 4, 'C': 4, 'D': 7})

R1 = D1 & D2

print(R1)  # intersection:  min(c[x], d[x])
print(D2 - D1)  # subtract (keeping only positive counts)

Выход

Counter({'D': 5, 'C': 4, 'A': 2, 'B': 1})
Counter({'B': 3, 'D': 2, 'A': 1})

Если вы хотите сохранить отрицательный счет, вы можете сделать это следующим образом:

from collections import Counter

D1 = Counter({'A': 2, 'B': 1, 'C': 4, 'D': 5, 'E': 5})
D2 = Counter({'A': 3, 'B': 4, 'C': 4, 'D': 7, 'E': 3})

R2 = Counter({key: D2.get(key, 0) - value for key, value in D1.items()})
print(R2)

Выход

Counter({'B': 3, 'D': 2, 'A': 1, 'C': 0, 'E': -2})

В приведенном выше примере 'E' : -2, поскольку счет E равен 5 в D1 и 3 в D2. Примечание: Все примеры приведены в Python 3.5.

0 голосов
/ 14 сентября 2018

Я не смог понять вопрос, но из моего понимания:

R1 = {k: min(v, D2[k]) for k, v in D1.items()}
R2 = {k: abs(v - D2[k]) for k, v in D1.items()}

Результат

>>> {k: min(v, D2[k]) for k, v in D1.items()}
{'A': 2, 'B': 1, 'C': 4, 'D': 5}
>>> {k: abs(v - D2[k]) for k, v in D1.items()}
{'A': 1, 'B': 3, 'C': 0, 'D': 2}
...