Я в настоящее время использую следующую функцию для сравнения значений словаря. Существует ли более быстрый или лучший способ сделать это?
match = True
for keys in dict1:
if dict1[keys] != dict2[keys]:
match = False
print keys
print dict1[keys],
print '->' ,
print dict2[keys]
Править: Оба dicts содержат те же ключи.
Если dicts имеют идентичные наборы ключей и вам нужны все эти отпечатки для любой разницы значений, вас мало сможет сделать; может быть что-то вроде:
diffkeys = [k for k in dict1 if dict1[k] != dict2[k]]
for k in diffkeys:
print k, ':', dict1[k], '->', dict2[k]
в значительной степени эквивалентно тому, что у вас есть, но вы можете получить более красивую презентацию, например, отсортировав ключи различий перед тем, как зацикливаться на нем.
You can use sets for this too
>>> a = {'x': 1, 'y': 2}
>>> b = {'y': 2, 'x': 1}
>>> set(a.iteritems())-set(b.iteritems())
set([])
>>> a['y']=3
>>> set(a.iteritems())-set(b.iteritems())
set([('y', 3)])
>>> set(b.iteritems())-set(a.iteritems())
set([('y', 2)])
>>> set(b.iteritems())^set(a.iteritems())
set([('y', 3), ('y', 2)])
Эм, вы описываете dict1 == dict2
( проверьте, равны ли бот-дикты )
Но ваш код делает all( dict1[k]==dict2[k] for k в dict1 )
( проверьте, все ли записи в dict1 равны тем, что в dict2 )
>>> a = {'x': 1, 'y': 2}
>>> b = {'y': 2, 'x': 1}
>>> print a == b
True
>>> c = {'z': 1}
>>> print a == c
False
>>>
Если вы просто сравниваете для равенства, вы можете просто сделать это:
if not dict1 == dict2:
match = False
Иначе, единственная большая проблема, которую я вижу, это то, что вы получите KeyError, если есть ключ в диктате 1, который не в диктате 2, так что вы можете захотеть сделать что-то вроде этого:
for key in dict1:
if not key in dict2 or dict1[key] != dict2[key]:
match = False
Вы можете сжать это в понимание, чтобы просто получить список ключей, которые тоже не совпадают:
mismatch_keys = [key for key in x if not key in y or x[key] != y[key]]
match = not bool(mismatch_keys) #If the list is not empty, they don't match
for key in mismatch_keys:
print key
print '%s -> %s' % (dict1[key],dict2[key])
Единственной другой оптимизацией, о которой я могу подумать, может быть использование "len(dict)", чтобы выяснить, какой из диктатов имеет меньше записей, и пропустить через него сначала самый короткий цикл.
.