Вопрос по python-2.7, python, dictionary – Сравнение / объединение двух словарей

2

У меня есть два словаря с парами ключ-значение следующим образом:

<code>dict-1  ch:23, 100
        ch:24, 95

dict-2  Ch:23, 98
        ch:25, 100
</code>

Не все ключи присутствуют в обоих словарях, и каждый словарь содержит приблизительно 200 000 пар ключ-значение. То, что я хочу сделать, это сравнить или объединить эти два и создать выходной текстовый файл, так что если ключ находится в обоих словарях, я получу оба значения в формате выходного файла, например:

<code>ch:23   100   98         
ch:24   95    .    
Ch:25   .     100
</code>

Как я могу это сделать?

Ваш Ответ

1   ответ
4

Note Если вы используете словарь (если только OrderedDict), порядок не будет сохранен, поэтому окончательный порядок вашего результата не будет таким, как вы изображали в своем примере

Возвращаясь к вашему примеру Если

>>> d1={'ch:23': 100, 'ch:24': 95}
>>> d2={'ch:23': 98 ,'ch:25': 100}

Вы можете попробовать это

>>> d3=collections.defaultdict(list)
>>> for k,e in d1.items()+d2.items():
    d3[k].append(e)

Если вы хотите сохранить Орден, вам нужно сначала создать оригинальный словарь как упорядоченный словарь

Тогда вы можете сделать как

>>> d1
OrderedDict([('ch:23', 100), ('ch:24', 95)])
>>> d2
OrderedDict([('ch:23', 98), ('ch:25', 100)])
>>> d3=collections.OrderedDict()
>>> for k,e in d1.items()+d2.items():
    d3.setdefault(k,[]).append(e)   
>>> d3
OrderedDict([('ch:23', [100, 98]), ('ch:24', [95]), ('ch:25', [100])])
>>> 
Спасибо за заказанный документ. Мне нужно было это использовать, и после установки python 2.7.x это, похоже, решило мою проблему. Однако, когда значение было одинаковым для общего ключа между двумя диктовками, исходное значение было перезаписано, так что в выходных данных оно имело только одно значение. jobrant
Я думаю, что я решил эту проблему с некоторой помощью от друга кодера. После создания OrderedDict: jobrant
1. OrderedDict не поддерживает операторы + или + =, как словари, вы можете преодолеть это с помощью метода update (). 2. OrderedDict не позволяет вставлять элементы, только добавлять, которые могут понадобиться, если вы сосредоточены на заказе. Этого можно избежать, создав новый OrderedDict и вставив элемент в нужное место, что дорого. В качестве альтернативы вы можете переопределить OrderedDict и добавить метод insert (). 3. Я решил просто использовать списки. После раздувания кода с переопределением OrderedDict я решил, что преимущество не стоит нечитаемого кода.
Друг помог с этим: После создания OrderedDict: merged_keys = d1_keys + d2_keys merged_keys = uniq (merged_keys) распечатать merged_keys распечатать len (merged_keys) d3 = collection.OrderedDict () output_doc = open (& quot; combo.txt & quot; wot & quot; w +) ;) для ch_pos в merged_keys: line_output = ch_pos if (d1.has_key (ch_pos)): line_output = line_output + & quot; \ t & quot; + d1 [ch_pos] else: line_output = line_output + & quot; \ t & quot; + & quot; ND & quot; if (d2.has_key (ch_pos)): line_output = line_output + & quot; \ t & quot; + d2 [ch_pos] else: line_output = line_output + & quot; \ t & quot; + & quot; ND & quot; output_doc.write (line_output + & quot; \ n & quot;) jobrant

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