前提・実現したいこと
現在私は、複数の値が格納されたリスト型をvalueとした3つの辞書を用いて、「もしvalueとしたリスト内に同じ値が3つの辞書全てにあった際に、そのvalueのkeyを3組とした新たなリストを生成する」プログラムを構築することを目的としています。
例として、辞書が
1_dict = {A:[0,1,2]} 2_dict = {C:[0,2,3],D:[1,2]} 3_dict = {E:[2,3],F:[0],G:[1]}
である場合は
[[A,C,F](valueの0が共通),[A,D,G](valueの1が共通),[A,C,E](valueの2が共通),[A,D,E](valueの2が共通)]
というリストを(valueの~が共通)という部分を除いて出力させたいと考えています。
そのための処理として、「辞書のkeyとvalueをそれぞれ別のリストに格納した上で、入れ子構造のリストになったvalueのリストを回すことで数値が一致しているか確認した上で、key要素を格納したリストと照合させてkey要素を抽出、出力用のリストに入れる」という処理を実現させたいと考えています。
発生している問題・エラーメッセージ
しかし、value要素を格納したリストを回そうとした所、以下のエラーメッセージが発生してしまいました。
for x1,x2,x3 in val1,val2,val3: ValueError: too many values to unpack (expected 3)
該当のソースコード
Python3
1#coding:utf-8 2import re 3import pandas as pd 4#import numpy as np#数値計算を容易にする 5from collections import defaultdict#辞書型で一つのkeyに複数のvalueをappend処理できるようにする 6from itertools import zip_longest#zip_longestは最も長い要素に合わせて要素をまとめる処理 7 81_dict = {A:[0,2,4,6],B:[0,1,2,3,7]} 92_dict = {C:[1,2,3,5],D:[1,2,5,6]} 103_dict = {E:[2,3,6,7],F:[0,2,3,6],G:[1,4,6]} 11 12key1,key2,key3 = [],[],[]#辞書のkeyのみを格納するリスト 13val1,val2,val3 = [],[],[]#辞書のvalueのみを格納するリスト 14res = []#出力用のリスト 15 16for 1_key,1_value in 1_dict.items(): 17 key1.append(1_key)#辞書のkey部分のみを格納 18 val1.append(1_value)#辞書のvalue部分のみを格納 19 20for 2_key,2_value in 2_dict.items(): 21 key2.append(2_key)#辞書のkey部分のみを格納 22 val2.append(2_value)#辞書のvalue部分のみを格納 23 24for 3_key,3_value in 3_dict.items(): 25 key3.append(3_key)#辞書のkey部分のみを格納 26 val3.append(3_value)#辞書のvalue部分のみを格納 27 28for x1,x2,x3 in val1,val2,val3:# 29 for y1,y2,y3 in val1[x1][-1],val2[x2][-1],val3[x3][-1]: 30 if (val_hi[x1][y1] - val_ha[x2][y2]) ** 2 == 0 and (val_hi[x1][y1] - val_t[x3][y3]) ** 2 == 0: 31 res.append(key1[x1],key2[x2],key3[x3]) 32
理想の出力
res = [[B,C,G],[B,D,G],[A,C,E],[A,C,F],[A,D,E],[A,D,F],[B,C,E],[B,C,F],[B,D,E],[B,D,F],[B,C,E].[B,C,F],[A,D,E],[A,D,F],[A,D,F],[A,D,G]]
試したこと
for x1,x2,x3 in key1,key2,key3: for y1,y2,y3 in val1[x1][-1],val2[x2][-1],val3[x3][-1]:
の部分をいくらかいじっていましたが、どうにもなりませんでした。
補足情報(FW/ツールのバージョンなど)
Pythonのバージョンは3.6.5です。
valueの2が共通なのはA,C,D,Eでなはいでしょうか?
一つのdictから一つのkeyのみを抽出して三つ組を構築することを目的としているので、
[A,C,E],[A,C,F],[A,D,E],[A,D,F]
の四つの三つ組を出力することが目的になっています。
そのため、問題上記の例は意図的なものです。
valueの2が共通なkeyを2_dictから取り出す場合、C,Dともに2を含みますが
DではなくCを取り出すルールは何でしょうか?
先に出現するkey要素を優先的に取り出すルールで三つ組を作成しています。
また、DもCが取り出された後に取り出します。
一般的に辞書はキーの並びは順不同なのですが
とにかく先に出現したものを優先して取り出したいということでよいでしょうか?
重複して取り出されるようなことがない限りは問題ありません。
回答2件
あなたの回答
tips
プレビュー