2015-03-25 2 views
3

Я новичок в Python. У меня есть два словаря, которые имеют одни и те же ключи, но разные значения для ключей. Я бы хотел сравнить два словаря, чтобы получить цифровую разницу значений для каждого ключа. Например:Сравнение значений двух словарей для получения их числовой разницы Python

dict1 = {'hi' : 45, 'thanks' : 34, 'please' : 60}

dict2 = {'hi' : 40, 'thanks' : 46, 'please' : 50}

Другими словами, я хотел бы получить третий словарь или список пар, которые показывают численное различие значений в пределах этих двух словарей (iesubtracting . значения dict1 из dict2 (или наоборот), было бы, таким образом, что-то вроде этого:

dict_difference = {'hi' : 5 , 'thanks' : -12, 'please' : 10}

Я знаю, что subtractin г один словарь от другого:

dict1 = Counter({'hi' = 45, 'thanks' = 34, 'please' = 60})

dict2 = Counter({'hi' = 40, 'thanks' = 46, 'please' = 50})

dict3 = dict1-dict2 # будет возвращать только положительные значения, так что это даст:

dict3 = {'hi'= 5, 'please' = 10} #, который является не то, что я хочу.

Я также думал о преобразовании словарей в список пар (я думаю, что это, как это называется):

dictlist = [] 
for key, value in dict1.iteritems():` 

    temp = (key, value) 
    dictlist.append(temp) 

и поэтому

print dictlist  #gives: 

[('hi', 45),('thanks' = 34), ('please' = 60)] 

Так что я подумал, что если я могу чтобы преобразовать словарь в список пар, а затем сделать его в форме ключа: значение будет ключевым = значение. Я бы смог применить метод subtract() и добиться того, чего хочу.

Я думал о достижении этого через def __repr__(self), как показано на картинке https://docs.python.org/2/library/collections.html, но я не зашел далеко.

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

+0

Это не в словарном формате – letsc

ответ

9

Во-первых, формат ваших словарей не является правильным (: и не =):

dict1 = {'hi':45, 'thanks':34, 'please':60} 
dict2 = {'hi':40, 'thanks':46, 'please':50} 

Вы можете использовать словарь понимания. Вы в основном прокручиваете один словарь, проверяете, что ключ находится во втором словаре и вставляйте разницу значений в выходном словаре. Все в одной строке.

dic = {key: dict1[key]-dict2[key] for key in dict1 if key in dict2} 
+0

Привет! Большое спасибо за ваш ответ и за решение этого для меня, а также за то, что вы исправили синтаксис словаря. Я попробовал, и это действительно работает! Благодаря! – HR123r

+0

добро пожаловать. –

3

Вы были на правильном пути, думая об использовании клавиш словарей.

Здесь я просматриваю ключи первого словаря, проверяя, находятся ли они в словаре2. Затем я делаю то же самое со словарем2, проверяя ключи в словаре1, но также гарантируя, что ключ еще не находится в словаре результатов, поэтому мы не делаем двойного вычитания.

dict1 = {'hi': 45, 'thanks': 34, 'please': 60} 
dict2 = {'hi': 40, 'thanks': 46, 'please': 50} 
result = {} 

for key in dict1.keys(): 
    if key in dict2: 
    result[key] = dict1[key] - dict2[key] 

for key in dict2.keys(): 
    if key in dict1 and not key in result: 
    result[key] = dict1[key] - dict2[key] 
+0

Если цель состоит в том, чтобы обрабатывать только ключи, разделяемые обоими диктофонами, то второй цикл не нужен, поскольку в первом цикле уже были обнаружены все общие ключи. Кроме того, вызов на «клавиши» не нужен, поскольку уже выполняется цикл над сигнальными циклами по клавишам. Вызов «ключей» просто тратит лишнее время и пространство на создание списка ключей. – user2357112

+0

Собирался сказать то же самое. –

+0

@ Код JulienSpronck на самом деле более эффективен, чем эта паста, поэтому идите с ним. – Celeo

Смежные вопросы