#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
, что это действительно приведет к вычитанию подсчетов, но сохранит только результаты с положительными значениями.