Процентная разница между двумя объектами счетчика

#python #counter

Вопрос:

У меня есть два встречных объекта, подобных этому:

 A1 = {‘word1’: 7, ‘word2’: 5, ‘word3’: 4}
A2 = {‘word1’: 3, ‘word2’: 2, ‘word3’: 4}
 

Я хочу вычислить процентную разницу между двумя счетчиками, чтобы получить что-то вроде:

 R = {‘word1’: -57.1, ‘word2’: -60, ‘word3’: 0}
 

Я пробовал это решение, но оно выдает ошибку

 R = ((A2 - A1) / A1) * 100 

TypeError: unsupported operand type(s) for /: 'Counter' and 'Counter'
 

Любые советы будут оценены по достоинству!

Комментарии:

1. Каким должно быть значение ключа, который находится в A1, но не в A2?

Ответ №1:

Без помощи дополнительного импорта модулей:-

 A1 = {'word1': 7, 'word2': 5, 'word3': 4}
A2 = {'word1': 3, 'word2': 2, 'word3': 4}

r = {}

for k, v in A1.items():
    r[k] = (A2[k] - v) / v * 100

print(r)
 

Ответ №2:

Один из подходов заключается в использовании понимания словаря:

 from collections import Counter

A1 = Counter({'word1': 7, 'word2': 5, 'word3': 4})
A2 = Counter({'word1': 3, 'word2': 2, 'word3': 4})

res = {key: (A2.get(key, 0) / value - 1) * 100 for key, value in A1.items()}
print(res)
 

Выход

 {'word1': -57.14285714285714, 'word2': -60.0, 'word3': 0.0}
 

Другой подход состоит в том, чтобы использовать то же понимание, но давать только те результаты, которые находятся на пересечении встречных объектов:

 # A1 with an extra key
A1 = Counter({'word1': 7, 'word2': 5, 'word3': 4, 'word4': 5})
A2 = Counter({'word1': 3, 'word2': 2, 'word3': 4})

res = {key: (A2[key] / value - 1) * 100 for key, value in A1.items() if key in A2}
print(res)
 

Выход

 {'word1': -57.14285714285714, 'word2': -60.0, 'word3': 0.0}
 

Обратите внимание A2 - A1 , что это действительно приведет к вычитанию подсчетов, но сохранит только результаты с положительными значениями.