2015-04-15 2 views
2
from collections import OrderedDict 
b= OrderedDict([('04-25', 5), ('04-23', 53), ('04-20', 3), ('04-2', 33)]) 
# b = OrderedDict() 
c = OrderedDict([('04-20', 5), ('03-18', 53), ('03-13', 3), ('03-12', 133)]) 
b_data = OrderedDict() 
for k , v in b.items()+c.items(): 
    b_data.setdefault(k,[]).append(v) 

f_data = OrderedDict() 

for k1, v1 in b_data.iteritems(): 
    if len(v1)==1: 
     f_data[k1]=v1[0],0 
    else: 
     f_data[k1]=v1[0],v1[1] 
print f_data 

я могу получить выход f_dataOrderedDict Слить и Append 0, если не

OrderedDict([('04-25', (5, 0)), ('04-23', (53, 0)), ('04-20', (3, 5)), ('04-2', (33, 0)), ('03-18', (53, 0)), ('03-13', (3, 0)), ('03-12', (133, 0))]) 

Но при слиянии Ь и с позиций, в f_data значение [0] должно быть б значение и значение [1] должна иметь значение c. если в этом нет значения, положите 0.

Если элементы b пустые, мы должны сохранить 0 в значении [0] и c элементов в значении [1].

Если b и c имеют одинаковое слияние ключей вместе со своими значениями, как я упоминал выше.

Мой ожидаемый выход для выше данных,

OrderedDict([('04-25', (5, 0)), ('04-23', (53, 0)), ('04-20', (3, 5)), ('04-2', (33, 0)), ('03-18', (0, 53)), ('03-13', (0, 3)), ('03-12', (0,133))]) 
+0

Вы можете очистить свой код? нет причин «импортировать коллекции», если вы собираетесь импортировать 'OrderedDict' из' collections'. Аналогично, вы определяете 'b' и' c', а затем переопределяете их на следующих двух строках. нет оснований для первых определений. – dbliss

+1

, пожалуйста, проверьте сейчас –

ответ

4

Это сделает работу за вас:

from collections import OrderedDict 

b = OrderedDict([('04-25', 5), ('04-23', 53), ('04-20', 3), ('04-2', 33)]) 
c = OrderedDict([('04-20', 5), ('03-18', 53), ('03-13', 3), ('03-12', 133)])  
f_data = OrderedDict() 
for key in b.keys() + c.keys(): 
    if not f_data.has_key(key): 
     try: 
      val_b = b[key] 
     except KeyError: 
      val_b = 0 
     try: 
      val_c = c[key] 
     except KeyError: 
      val_c = 0 
     f_data[key] = (val_b, val_c) 
print f_data 

Когда я запускаю этот код, я получаю следующий результат:

OrderedDict([('04-25', (5, 0)), ('04-23', (53, 0)), ('04-20', (3, 5)), ('04-2', (33, 0)), ('03-18', (0, 53)), ('03-13', (0, 3)), ('03-12', (0, 133))]) 
+0

сливание правильное, но результатом является OrderedDict ([04-25 ', ((5, 0), 0)), ('04 -23', ((53, 0), 0)) , ('04 -20 ', ((3, 0), (0, 5))), ('04 -2', ((33, 0), 0)), ('03 -18 ', (0 , (0, 53))), ('03 -13 ', (0, (0, 3))), ('03 -12', (0, (0, 133)))]) Но я хочу, чтобы значение как (5,0), (53,0), (3,5) .... –

+0

Хмм, я не понимаю. Я получаю то, что вы хотите, когда я запускаю код. – dbliss

+0

Ваш выход: OrderedDict ([(04-25 ', ((5, 0), 0)), ('04 -23', ((53, 0), 0)), ('04 -20 ', ((3, 0), (0, 5))), ('04 -2 ', ((33, 0), 0)), ('03 -18', (0, (0, 53))) , ('03 -13 ', (0, (0, 3))), ('03 -12', (0, (0, 133)))]) –

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