Форум сайта python.su
0
Всем привет
Помогите справиться, как мне казалось, с простой задачей.
Питон только начал изучать..
Есть 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' }
(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)
Офлайн
3
Слишком мало данных, что там вообще может быть… И “маске “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)
Офлайн
0
И “маске “AAA_AAA””, а в коде у тебя if “aa”.Я поменял “AAA_AAA” на “аа”, чтобы проще было..
Офлайн
3
Stml
Я поменял “AAA_AAA” на “аа”, чтобы проще было..
Там вместо этих “аа”, название услуги и номер сервиса вида: “NAME_OF_SERVICE”:“NAME_OF_SERVICE_1”, соответственно в другом списке: “NAME_OF_SERVICE_1”:“True”.
Офлайн
0
Ваш вариант не работает, а жаль..
Решил сам, наверное, коряво:
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)
Офлайн
3
Не стоит называть входные данные словом “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)
Офлайн
253
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'}
Отредактировано doza_and (Авг. 7, 2015 08:21:18)
Офлайн
103
однострочник :) без доп модулей
>>> 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”
Офлайн
253
Ваш вариант мне понравился. Но есть маленькая тонкость, похоже вами предусмотренная. :)
(k not in dict1) ^ (v == 'True')
>>> 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)
Офлайн
103
doza_andСпасибо, от Вас приятно это слышать :)
Ваш вариант мне понравился.
doza_andЭто xor - исключающее или
но для новичков полезно напомнить что это побитовый оператор или. И он не тоже самое что or
>>> 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
Офлайн