2016-06-20 1 views
1

У меня есть следующие два массивных словарей:быстрый способ для сравнения [1:] элементы значения в 2 Словаре списков

Dic1={0:['F','15','O+','5'],1:['M','12','O+'],2:[F,'20','O-'],3:['F','10','A+'],4:['M','45','?']...} 

Dic2={0:['M','15','O+','5'],1:['M','12','O+'],2:[F,'20','A-'],3:['F','10','A+'],4:['F','15','?'],5:['M','10','A+']...} 

и мне нужно, чтобы сравнить и найти V [1:] которые равны в обоих словарях, чтобы объединить их только в одном словаре и удалить значение из другого.

Новый Dic1:

Dic1={0:['F,M','15','O+','5'],1:['2M','12','O+'],2:[F,'20','O-'],3:['2F,M','10','A+'],4:['M','45','?']...} 

Новый Dic2:

Dic2={2:[F,'20','A-'],4:['F','15','?'],...} 

Идея, которую я до сих пор:

for ((key1, value1), (key2, value2)) in zip(Dic1.items(), Dic2.items()): 
if value1[1:]==value2[1:]: 
    value1.append(value2[:1])  
    del Dic1[Value2] 

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

+1

Почему это нулевое индексирование 'dict()' вместо простого списка списков? Я не вижу большой разницы ... – Will

+0

Причина в том, что словари были сделаны из более сложной базы данных, и похоже, что итерация в словаре быстрее. – user3671704

ответ

0

Ниже следует произвести желаемые результаты:

Dic1={0:['F','15','O+','5'],1:['M','12','O+'],2:['F','20','O-'],3:['F','10','A+'],4:['M','45','?']} 
Dic2={0:['M','15','O+','5'],1:['M','12','O+'],2:['F','20','A-'],3:['F','10','A+'],4:['F','15','?'],5:['M','10','A+']} 

for i in Dic1.keys(): 
    if Dic1[i][1:] == Dic2[i][1:]: 
     if Dic1[i][0] == Dic2[i][0]: 
      Dic1[i][0] = '2' + Dic1[i][0] 
     else: 
      Dic1[i][0] += ',' + Dic2[i][0] 
     Dic2.pop(i) 

print Dic1 
print Dic2 

выше производит:

{0: [ 'Р, М', '15', 'О +', '5'], 1: ['2M', '12', 'O +'], 2: ['F', '20', 'O-'], 3: ['2F', '10', 'A +'], 4 : ['M', '45', '?']}

{2: ['F', '20', 'A-'], 4: ['F', '15', '? '], 5: [' M ',' 10 ',' A + ']}

+0

Итерация словаря осуществляется через его ключи. Поэтому вы можете использовать 'for i в Dic1:' вместо 'for i в Dic1.keys():'. – zondo

+0

Это работает, но не выполняет итерацию во всех ключах, например, словари: Dic1 = {0: ['F', '15', 'O +', '5'], 1: ['M' , '12' , 'О +'], 2: [ 'Р', '20', 'О -'], 3: [ 'Р', '10', 'А +'], 4: [ 'М', '45', '?']} Dic2 = {0: ['M', '15', 'O +', '5'], 1: ['M', '12', 'O +'], 2: [ 'Р', '20', 'А -'], 3: [ 'Р', '10', 'А +'], 4: [ 'Р', '15', '?'], 6 : ['F', '15', 'O +', '5']} Последнее значение на dic2 не принимает во внимание, и я получаю: {0: ['F, M', '15' , 'O +', '5'], 1: ['2M', '12', 'O +'], 2: ['F', '20', 'O-'], 3: ['2F', '10', 'A +'], 4: ['M', '45', '?']} {2: ['F', '20', 'A-'], 4: ['F' , '15', '?'], 6: ['F', '15', 'O +', '5']} – user3671704

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