Python 3.x - ネストされた辞書を反復して類似の値を検索し、同じキーを持つ辞書のリストに追加します

okwaves2024-01-25  11

CSV ファイルは networkx グラフに取り込まれ、以下の形式に反復処理されます。 これは、辞書を反復処理するために使用しているコードです。


diction = {
  "1234":{
          "name":"XYZ",
          "rollNo":"2",
          "marks":"40"
   },
  "2122":{
          "name":"XYZ",
          "rollNo":"2",
          "marks":"60"
   }
}
new_dict = {}
key_list = []
for key,values in diction.items():
    if key not in key_list:

        name = values['name']
        rollNo = values['rollNo']
        for k,v in diction.items():
            if k not in key_list:
                key_list.append(key)
                key_list.append(k)
                if name == v['name'] and rollNo == v['rollNo']:
                    if (k,key) not in key_list:
                        new_dict.setdefault(key, []).append(v)
                    elif key in key_list:
                        new_dict[key].append(v)
                    elif k in key_list:
                        new_dict[k].append(v)
                else:
                    new_dict.setdefault(key, []).append(v)

print(new_dict)

入力:

{
  "1234":{ 
          "name":"XYZ",
          "rollNo":"2",
          "marks":"40"
   },
  "2122":{
          "name":"XYZ",
          "rollNo":"2",
          "marks":"60"
   }
}

出力:

{
  "1234":[{ 
          "name":"XYZ",
          "rollNo":"2",
          "marks":"40"
       },
       {
          "name":"XYZ",
          "rollNo":"2",
          "marks":"60"
      }]
}

チェックすべき 500 万個のキーがあります。 私は現在 for inside for を使用していますが、時間の複雑さが n ^ n であるため、非常に時間がかかります。 最適化されたソリューションが必要です。

試しているコードは何ですか?

– ヴィシャル・シン

2020 年 9 月 3 日11:17

@VishalSingh が私のコードを含む質問を更新しました。

– アクシャイ・コルディア

2020 年 9 月 3 日 11:31

私の理解では、あなたは「マージ」します。キー「1234」に関連付けられたリスト内の 2 つの辞書キー「name」の値が同じであるためです。および「ロールNo」。そうですか?

– qouify

2020 年 9 月 5 日 16:37



------------------------

コードのアルゴリズム構造以外に、コードには大きな問題が 1 つあります。 key_list.append(key) と key_list.append(k) の 2 行では、key_list は文字列値を保持すると想定されています。ただし、後の if (k,key) not in key_list では、key_list がタプル値 (文字列のペア) を保持すると想定します。したがって、このテストは常に True と評価されるように思えます。

問題を正しく理解していれば、これで問題が解決する可能性があります (少なくとも、例に必要な出力が生成されます)。

diction = {
  "1234":{
          "name":"XYZ",
          "rollNo":"2",
          "marks":"40"
   },
  "2122":{
          "name":"XYZ",
          "rollNo":"2",
          "marks":"60"
   }
}

new_dict = {}
attrib = {}  #  a dictionary mapping (name, rollNo) to diction keys
for key, values in diction.items():
    name = values['name']
    rno = values['rollNo']
    if (name, rno) not in attrib:  #  couple (name, rollNo) unseen so far
        new_dict[key] = [values]
        attrib[(name, rno)] = key  #  record the association(name, rollNo) <-> key
    else:  #  couple (name, rollNo) already seen
        new_dict[attrib[(name, rno)]].append(values)
print(new_dict)

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。