Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 7, 2015 00:16:34

Stml
Зарегистрирован: 2014-09-12
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Сравнение 2-х словарей по ключу и значению

Всем привет
Помогите справиться, как мне казалось, с простой задачей.
Питон только начал изучать..

Есть 2 словаря:

dict1 = {
	'EE_EE':'True',
	'MM_MM':'True',
        'MM_M':'False',
	'MSG_MSG':'True',
	'aa':'aaa_1'
}
dict2 = {
	'EE_EE':'True',
	'MM_MM':'False',
        'MM_M2':'False',
	'MSGMSG':'True',
	'aaa_1':'True'
}

Надо сравнить все ключи с их значениями в 2-х словарях, я голову уже сломал, то одно не рабоатет, то другое (
Причем если в dict2 есть ключь который подходит по маске “AAA_AAA”, а его значение “True” и он есть в значении dict1 - ок, а если он “False” и его нету в dict1 - ок

Помогите починить мой код:

def compare(result, options):
           for key in result.keys():
		print options[key]
		if not key in options:
			if "aa" in key:
				if result[key] == 'True':
					if not key in [i for i in options.values()]:
						print 'bad'
				else:
					if key in [i for i in options.values()]:
						print 'bad2'
			else:
				print "name of pack do not similar"
		else:
			if result[key] == options[key]:
				print "=="
			else:
				print "!="
if __name__ == '__main__':
	compare(dict2, dict1)

Отредактировано Stml (Авг. 7, 2015 00:32:17)

Офлайн

#2 Авг. 7, 2015 00:59:04

Iskatel
Зарегистрирован: 2015-07-29
Сообщения: 291
Репутация: +  3  -
Профиль   Отправить e-mail  

Сравнение 2-х словарей по ключу и значению

Слишком мало данных, что там вообще может быть… И “маске “AAA_AAA””, а в коде у тебя if “aa”.
Не пытайся закодить то что ты не осознал и не можешь описать словами, ибо код есть воплощение твоего понимания

Навскидку так:

dict1 = {
	'EE_EE':'True',
	'MM_MM':'True',
        'MM_M':'False',
	'MSG_MSG':'True',
	'aa':'aaa_1'
}
dict2 = {
	'EE_EE':'True',
	'MM_MM':'False',
        'MM_M2':'False',
	'MSGMSG':'True',
	'aaa_1':'True'
}
for key in dict2:
    try:
        if dict2[key] != dict1[key]:
            print 'bad', key
    except KeyError:
        if "aa" in key and dict2[key] == True:
            print 'toje bad', key
print 'Davai, lava, davai. Davai otkrivai svoi anglorusskii slovar'

Отредактировано Iskatel (Авг. 7, 2015 01:08:49)

Офлайн

#3 Авг. 7, 2015 01:16:23

Stml
Зарегистрирован: 2014-09-12
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Сравнение 2-х словарей по ключу и значению

И “маске “AAA_AAA””, а в коде у тебя if “aa”.
Я поменял “AAA_AAA” на “аа”, чтобы проще было..

Там вместо этих “аа”, название услуги и номер сервиса вида: “NAME_OF_SERVICE”:“NAME_OF_SERVICE_1”, соответственно в другом списке: “NAME_OF_SERVICE_1”:“True”.

Офлайн

#4 Авг. 7, 2015 01:19:06

Iskatel
Зарегистрирован: 2015-07-29
Сообщения: 291
Репутация: +  3  -
Профиль   Отправить e-mail  

Сравнение 2-х словарей по ключу и значению

Stml
Я поменял “AAA_AAA” на “аа”, чтобы проще было..

Там вместо этих “аа”, название услуги и номер сервиса вида: “NAME_OF_SERVICE”:“NAME_OF_SERVICE_1”, соответственно в другом списке: “NAME_OF_SERVICE_1”:“True”.

Это очень полезная информация… Я к тому, чтоб ты сам не запутался…

Офлайн

#5 Авг. 7, 2015 01:47:34

Stml
Зарегистрирован: 2014-09-12
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Сравнение 2-х словарей по ключу и значению

Ваш вариант не работает, а жаль..

Решил сам, наверное, коряво:

def compare(result, options):
	differences = {}
	for key, value in result.iteritems():
		if not key in options:
			if "NAME_OF_SERVICE" in key:
				if result[key] == 'True':
					if not key in [i for i in options.values()]:
						differences.update({key: value})
				else:
					if key in [i for i in options.values()]:
						differences.update({key: value})
			else:
				for key2 in options:
					if not key2 in result and 'NAME_OF_SERVICE' not in key2:
						differences.update({key2: options[key2]})
				differences.update({key : result[key]})
		else:
			if result[key] != options[key]:
				differences.update({key : result[key]})
				differences.update({key : options[key]})
	return differences


Выслушаю конструктивную критику

Отредактировано Stml (Авг. 7, 2015 01:47:55)

Офлайн

#6 Авг. 7, 2015 03:05:22

Iskatel
Зарегистрирован: 2015-07-29
Сообщения: 291
Репутация: +  3  -
Профиль   Отправить e-mail  

Сравнение 2-х словарей по ключу и значению

Не стоит называть входные данные словом “result” , ну хотяб на форум так не пиши, думать мешает

давай по логике:

def compare(result, options):
	differences = {}
	for key, value in result.iteritems(): #из дикт2 перебираем
		if not key in options: #если в дикт1 нету
			if "NAME_OF_SERVICE" in key: #и в дикт2 есть "ааа"
				if result[key] == 'True': #и если  в дикт2 от ааа писец как Тру
					if not key in [i for i in options.values()]: #то мы проверяем какуюто хню "нет ли ключа из первого словаря в ЗНАЧНИЯХ из второго
 #(где это в ТЗ?)"
						differences.update({key: value}) #пишем, что хрень получилась
				else:                                            #а если не тру
					if key in [i for i in options.values()]: #и в ЗНАЧЕНИЯХ нет ключа
						differences.update({key: value}) #то тоже хрень какуюто пишем
			else:
				for key2 in options: #тут надо снова перебрать словарь (НО УЖЕ ВТОРОЙ, опа... где это в ТЗ?)
# дальше не читал...
					if not key2 in result and 'NAME_OF_SERVICE' not in key2: 
						differences.update({key2: options[key2]})
				differences.update({key : result[key]})
		else:
			if result[key] != options[key]:
				differences.update({key : result[key]})
				differences.update({key : options[key]})
	return differences

Отредактировано Iskatel (Авг. 7, 2015 03:28:55)

Офлайн

#7 Авг. 7, 2015 08:17:44

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Сравнение 2-х словарей по ключу и значению

Stml
Причем если в dict2 есть ключь который подходит по маске “AAA_AAA”, а его значение “True” и он есть в значении dict1 - ок, а если он “False” и его нету в dict1 - ок

А чего тут голову ломать - как написали так и делайте.
import toolz.dicttoolz as td
dict1 = { 'EE_EE':'True', 'MM_MM':'True', 'MM_M':'False', 'MSG_MSG':'True', 'aa':'aaa_1'}
dict2 = {'EE_EE':'True', 'MM_MM':'False', 'MM_M2':'False', 'MSGMSG':'True', 'aaa_1':'True'}
on_cond1 = td.itemfilter(lambda (k, v): v == 'True' and "_" in k and k in dict1 ,dict2)
on_cond2 = td.itemfilter(lambda (k,v): v =='False' and k not in dict1, dict2)
result = td.merge(on_cond1,on_cond2)
>>> print result
{'EE_EE': 'True', 'MM_M2': 'False'}
Это буквально то что вы написали. Тут я допустил вольности - по маске AAA_AAA заменил на наличие подчеркивания. И если он есть в значениях трактую как если он есть в ключах. Ок трактую как необходимость выбора элемента - а то просто будет куча ок.
По существу строки “True”,“False” полезно заменить на 0,1 или True,False



Отредактировано doza_and (Авг. 7, 2015 08:21:18)

Офлайн

#8 Авг. 9, 2015 04:18:01

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Сравнение 2-х словарей по ключу и значению

однострочник :) без доп модулей

>>> dict1 = {'EE_EE': 'True',
...          'MM_MM': 'True',
...          'MM_M': 'False',
...          'MSG_MSG': 'True',
...          'aa': 'aaa_1'}
>>> dict2 = {'EE_EE': 'True',
...          'MM_MM': 'False',
...          'MM_M2': 'False',
...          'MSGMSG': 'True',
...          'aaa_1': 'True'}
>>> 
>>> result = {k: v for k, v in dict2.items() if v in ['True', 'False'] and len(k) - 1 > k.find('_') > 0 and k.count('_') == 1 and (k not in dict1) ^ (v == 'True')}
>>> result
{'EE_EE': 'True', 'MM_M2': 'False'}
Stml
который подходит по маске “AAA_AAA”
не совсем понятна маска! эт значит что только символы, что слева и справа должно быть одинаковое количество символов, что все символы в верхнем регистре? подробнее опишите!



————————————————
-*- Simple is better than complex -*-

Офлайн

#9 Авг. 9, 2015 10:32:06

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Сравнение 2-х словарей по ключу и значению

Ваш вариант мне понравился. Но есть маленькая тонкость, похоже вами предусмотренная. :)

(k not in dict1) ^ (v == 'True')
Такой стиль я встречал у многих профессионалов, но для новичков полезно напомнить что это побитовый оператор или. И он не тоже самое что or, Хотя для логических аргументов их действие одинаково. Еще у них них разные приоритеты
>>> True ^ 1
0
>>> True or 1
True

def pred(k,v):
    return ((v in ['True', 'False'] and
           len(k) - 1 > k.find('_') > 0 and
           k.count('_') == 1) and
           (k not in dict1) or (v == 'True'))
print({k: v for k, v in dict2.items() if pred(k,v)})
>>> 
{'aaa_1': 'True', 'MSGMSG': 'True', 'EE_EE': 'True', 'MM_M2': 'False'}
#для (k not in dict1) ^ (v == 'True')
>>> 
{'EE_EE': 'True', 'MM_M2': 'False'}
Что нужно ТС ему и решать …

А по поводу доп модулей я сразу не глянул что там делается. Если надо было-бы собирать из разных словарей значения то помоему удобнее мерджить.



Отредактировано doza_and (Авг. 9, 2015 10:34:27)

Офлайн

#10 Авг. 9, 2015 15:04:30

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Сравнение 2-х словарей по ключу и значению

doza_and
Ваш вариант мне понравился.
Спасибо, от Вас приятно это слышать :)
doza_and
но для новичков полезно напомнить что это побитовый оператор или. И он не тоже самое что or
Это xor - исключающее или
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
>>> 0^0
0
>>> True^True
False
>>> True^False
True
>>> False^True
True
>>> False^False
False
>>> True^1
0
>>> f = lambda a, b: (not a and b) or (a and not b)
>>> f(1, 1)
False
>>> f(1, 0)
True
>>> f(0, 1)
1
>>> f(0, 0)
0



————————————————
-*- Simple is better than complex -*-

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version