2013-07-18 3 views
0
data1=[{'aa': None, 'bb': 'dffg', 'cc': '0', 'dd': '1234', 'ee': None}, 
{'aa': 'cdfg', 'bb': None, 'cc': '0', 'dd': 'sc12', 'ee': 'edft'}, 
{'aa': 'bvkjdi', 'bb': 'hdjd', 'cc': '0', 'dd': None, 'ee': None}, 
{'aa': None, 'bb': None, 'cc': '0', 'dd': '123dg', 'ee': 'hddk'}] 


data2={'aa': ('','cdfg', 'bvkjdi', ''), 'bb': ('dffg','', 'hdjd', ''), 
'cc': ('0', '0', '0','0'), 'dd': ('1234', 'sc12', '','123dg'), 
'ee': ('', 'edft', '','hddk') } 

data1 - это список из того, что многие словари с его ключевыми значениями и данными2 являются словарями с его ключевыми значениями. Нужно сравнить эти два, но формат отличается. Нужно выяснить и простой способ сравнить «aa» данных1 до 'aa' от данных2, 'bb' значений данных1 до 'bb' значений данных2 аналогично для остальных вещей. Пожалуйста, помогите мне сравнить это.Сравнение списка с словарем?

+0

Что вы имеете в виду, сравнивая ?, разница, общая, истинная/ложная проверка, чтобы убедиться, что они такие же ...? – jcr

+0

@azorius: Чтобы убедиться, что они такие же или нет – user2558589

+0

Просьба привести пример. Вам не нужно показывать код, просто покажите свой «dict» и ваш «список» и ожидаемый результат. –

ответ

0

Вы можете сделать следующее:

>>> data1_like_data2 = {} 
>>> for item in data1: 
...  for key in item: 
...   try: 
...    data1_like_data2[key] += (item[key],) 
...   except: 
...    data1_like_data2.update({key:(item[key],)}) 
>>> data1_like_data2 
{'aa': (None, 'cdfg', 'bvkjdi', None), 'cc': ('0', '0', '0', '0'), 'dd': ('1234', 'sc12', None, '123dg'), 'ee': (None, 'edft', None, 'hddk'), 'bb': ('dffg', None, 'hdjd', None)} 

Затем сравните их непосредственно,

>>> data1_like_data2 == data2: 
>>> False 

Это дает Ложные из None и '0' проблема. Получите это отсортированное в соответствии с вашим требованием, тогда оно будет работать.

+0

: да, то же самое, что и этот – user2558589

+0

@ user2558589 Решает ли это вашу проблему? – Sudipta

+0

@ Sudipta: Мне нужно сравнить только значения aa и bb данных1 с значениями aa и bb данных2, пожалуйста, помогите мне – user2558589

0

при условии, что None = '' и 0 = '0' Я думаю, что это то, что вы хотите:

data1=[{'aa': None, 'bb': 'dffg', 'cc': 0, 'dd': '1234', 'ee': None}, 
{'aa': 'cdfg', 'bb': None, 'cc': 0, 'dd': 'sc12', 'ee': 'edft'}, 
{'aa': 'bvkjdi', 'bb': 'hdjd', 'cc': 0, 'dd': None, 'ee': None}, 
{'aa': None, 'bb': None, 'cc': 0, 'dd': '123dg', 'ee': 'hddk'}] 


data2={'aa': ('','cdfg', 'bvkjdi', ''), 'bb': ('dffg','', 'hdjd', ''), 
'cc': ('0', '0', '0','0'), 'dd': ('1234', 'sc12', '','123dg'), 
'ee': ('', 'edft', '','hddk') } 

results = {} 
for key in data2: 
    set1 = [x[key] for x in data1] 
    set1 = [str(x) if x is not None else '' for x in set1] 
    set2 = list(data2[key]) 

    results[key] = set1 == set2   
# results = {'aa': True, 'cc': True, 'dd': True, 'ee': True, 'bb': True}  
0

Вы можете реструктурировать data1 выглядеть data2 с помощью словаря понимания:

>>> n = {k: tuple(d[k] for d in data1) for k in data2} 
>>> n 
{'aa': (None, 'cdfg', 'bvkjdi', None), 'cc': ('0', '0', '0', '0'), 
'dd': ('1234', 'sc12', None, '123dg'), 'ee': (None, 'edft', None, 'hddk'), 
'bb': ('dffg', None, 'hdjd', None)} 

Поскольку вы хотите, чтобы None соответствовал '', мы также можем их конвертировать:

>>> n = {k: tuple(d[k] if d[k] is not None else '' for d in data1) for k in data2} 
>>> n 
{'aa': ('', 'cdfg', 'bvkjdi', ''), 'cc': ('0', '0', '0', '0'), 
'dd': ('1234', 'sc12', '', '123dg'), 'ee': ('', 'edft', '', 'hddk'), 
'bb': ('dffg', '', 'hdjd', '')} 

После чего:

>>> n == data2 
True 

Если вы хотите сравнить пары aa и bb ключ/значение, вы можете вытащить их:

>>> keys_to_compare = {'aa', 'bb'} 
>>> d1 = {k: tuple(d[k] if d[k] is not None else '' for d in data1) for k in keys_to_compare} 
>>> d2 = {k: v for k,v in data2.iteritems() if k in keys_to_compare} 
>>> d1 == d2 
True 

Или сравнить их на месте:

>>> all(tuple(d[k] if d[k] is not None else '' for d in data1) == data2[k] for k in keys_to_compare) 
True 
+0

Мне нужно сравнить только значения aa и bb данных1 с значениями aa и bb данных2, пожалуйста, помогите мне. – user2558589

+0

@ user2558589: Разве вы не сказали «аналогично остальным вещам»? – DSM

+0

Спасибо, он отлично работает. – user2558589

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