ディクショナリ型で同じのキーの値に配列を追加する

2021-04-09

 スクレイピング等をする際に、ディクショナリを使ってデータを操作する人は多いと思います。その際に「同じキーのデータが出てきてしまう」ということがたまにあります。例えば、下記のようなディクショナリがあったとします。

{key1 : [値1, 値2]}

 その後以下のようなディクショナリが出てきたとします。

{key1 : [値3, 値4]}

通常ディクショナリに配列を入れるときは下記のような文をfor文の中に入れてディクショナリの要素を追加していくことが多いと思います。

dictionary = {}
list = [] 

list.append(value)
dictionary[key1] = list

このような文を使用していると値3, 4が入ったkeyが来たときに要素が上書きされてしまいます。

 そこで以下のような関数を用意することで、同じディクショナリ内にリストを追加できます。

def exist_key(target_dict, key):
    exist = False
    for k in target_dict:
        if (k == key):
            exist = True
    return exist

def marge_dict(target_dict, new_dict):
    res = {}
    values = []

    if (len(target_dict) == 0):
        for k in new_dict:
            values.append(new_dict[k])
            res[k] = values
        return res

    for k in new_dict:
        if (exist_key(target_dict, k)):
            values.extend(target_dict[k])
        values.append(new_dict[k])
        res[k] = values
    return res

 marge_dict_valueに元のディクショナリと後のディクショナリを渡します。exist_keyでは元のディクショナリに同じキーのディクショナリが存在しているか確認しています。

 最終的に配列を追加した新しいディクショナリが返ってきます。