Есть ли лучший способ сравнить значения словаря

Я в настоящее время использую следующую функцию для сравнения значений словаря. Существует ли более быстрый или лучший способ сделать это?

match = True
for keys in dict1:
    if dict1[keys] != dict2[keys]:
        match = False
        print keys
        print dict1[keys],
        print  '->' ,
        print dict2[keys]

Править: Оба dicts содержат те же ключи.

43
задан randomThought 15 December 2009 в 23:57
поделиться

5 ответов

Если dicts имеют идентичные наборы ключей и вам нужны все эти отпечатки для любой разницы значений, вас мало сможет сделать; может быть что-то вроде:

diffkeys = [k for k in dict1 if dict1[k] != dict2[k]]
for k in diffkeys:
  print k, ':', dict1[k], '->', dict2[k]

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

40
ответ дан 26 November 2019 в 22:22
поделиться

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)])
10
ответ дан 26 November 2019 в 22:22
поделиться

Эм, вы описываете dict1 == dict2 ( проверьте, равны ли бот-дикты )

Но ваш код делает all( dict1[k]==dict2[k] for k в dict1 ) ( проверьте, все ли записи в dict1 равны тем, что в dict2 )

7
ответ дан 26 November 2019 в 22:22
поделиться
>>> a = {'x': 1, 'y': 2}
>>> b = {'y': 2, 'x': 1}
>>> print a == b
True
>>> c = {'z': 1}
>>> print a == c
False
>>> 
1
ответ дан 26 November 2019 в 22:22
поделиться

Если вы просто сравниваете для равенства, вы можете просто сделать это:

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)", чтобы выяснить, какой из диктатов имеет меньше записей, и пропустить через него сначала самый короткий цикл.

.
1
ответ дан 26 November 2019 в 22:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: