2016-08-19 11 views
0

私は、作成前に実際にチェックが行われていないPHP ArrayObjectを誰かが作成したデータベースを扱っています。私はそれがこのようになりますように、 Pythonのphpserializeライブラリのアンシリアライズモジュールを使用して辞書の辞書として、これを抽出することができる午前このオブジェクトのサブディクショナリを値で最適に抽出するにはどうすればよいですか?

{0: '{"0": {"0": "use_of_color", "1": "3"}, "1": {"0": "plant_variety", "1": "2"}, "2": {"0": "design", "1": "2"}, "3": {"0": "maintenance", "1": "2"}, "4": {"0": "environmental_stewardship", "1": "3"}}', 
1: '{"0": {"0": "use_of_color", "1": "3"}, "1": {"0": "plant_variety", "1": "2"}, "2": {"0": "design", "1": "3"}, "3": {"0": "maintenance", "1": "4"}, "4": {"0": "environmental_stewardship", "1": "2"}}', 
2: '{"0": {"0": "color", "1": 3}, "1": {"0": "plant_variety", "1": 3}, "2": {"0": "design", "1": 4}, "3": {"0": "maintenance", "1": 4}, "4": {"0": "environmental_stewardship", "1": 4}}', 
3: '{"0": {"0": "location", "1": "4"}, "1": {"0": "sizing", "1": "4"}, "2": {"0": "design", "1": "3"}, "3": {"0": "maintenance", "1": "3"}, "4": {"0": "visual_appeal", "1": "4"}}', 
4: '{"0": {"0": "visual_impact", "1": "3"}, "1": {"0": "plant_variety_and_health", "1": "4"}, "2": {"0": "design", "1": "3"}, "3": {"0": "maintenance", "1": 0}, "4": {"0": "environmental_stewardship", "1": "2"}}', 
5: '{"0": {"0": "location", "1": "3"}, "1": {"0": "sizing", "1": "3"}, "2": {"0": "design", "1": "3"}, "3": {"0": "maintenance", "1": "3"}, "4": {"0": "visual_appeal", "1": "3"}}', 

... 

56: '{"0": {"0": "visual_impact", "1": "2"}, "1": {"0": "plant_variety_and_health", "1": "3"}, "2": {"0": "design", "1": "1"}, "3": {"0": "maintenance", "1": "2"}, "4": {"0": "environmental_stewardship", "1": "1"}}', 
57: '{"0": {"0": "color", "1": 3}, "1": {"0": "plant_variety", "1": 2}, "2": {"0": "design", "1": 1}, "3": {"0": "maintenance", "1": 2}, "4": {"0": "environmental_stewardship", "1": 2}}', 
58: '{"0": {"0": "visual_impact", "1": "4"}, "1": {"0": "plant_variety_and_health", "1": "3"}, "2": {"0": "design", "1": "4"}, "3": {"0": "maintenance", "1": "3"}, "4": {"0": "environmental_stewardship", "1": "4"}}', 
59: '{"0": {"0": "visual_impact", "1": "3"}, "1": {"0": "plant_variety_and_health", "1": "3"}, "2": {"0": "design", "1": "3"}, "3": {"0": "maintenance", "1": "3"}, "4": {"0": "environmental_stewardship", "1": "4"}}', 
60: '{"0": {"0": "use_of_color", "1": "3"}, "1": {"0": "plant_variety", "1": "4"}, "2": {"0": "design", "1": "3"}, "3": {"0": "maintenance", "1": "2"}, "4": {"0": "environmental_stewardship", "1": "3"}}', 
61: '{"0": {"0": "use_of_color", "1": "3"}, "1": {"0": "plant_variety", "1": "4"}, "2": {"0": "design", "1": "3"}, "3": {"0": "maintenance", "1": "2"}, "4": {"0": "environmental_stewardship", "1": "3"}}', 
62: '{"0": {"0": "visual_impact", "1": "2"}, "1": {"0": "plant_variety_and_health", "1": "2"}, "2": {"0": "design", "1": "2"}, "3": {"0": "maintenance", "1": "1"}, "4": {"0": "environmental_stewardship", "1": "1"}}', 
63: '{"0": {"0": "visual_impact", "1": "4"}, "1": {"0": "plant_variety_and_health", "1": "3"}, "2": {"0": "design", "1": "3"}, "3": {"0": "maintenance", "1": "4"}, "4": {"0": "environmental_stewardship", "1": "4"}}', 
64: '{"0": {"0": "visual_impact", "1": "4"}, "1": {"0": "plant_variety_and_health", "1": "3"}, "2": {"0": "design", "1": "3"}, "3": {"0": "maintenance", "1": "4"}, "4": {"0": "environmental_stewardship", "1": "4"}}', 
65: '{"0": {"0": "visual_impact", "1": "3"}, "1": {"0": "plant_variety_and_health", "1": "3"}, "2": {"0": "design", "1": "3"}, "3": {"0": "maintenance", "1": "2"}, "4": {"0": "environmental_stewardship", "1": "3"}}'} 

問題は、私はサブを抽出する方法が必要だということです(例えば、 "visual_impact"や "color"などのものを含む)同じ値を持つ辞書。ただし、これらのサブディクショナリはオブジェクト全体で同じキーとペアになっていないため、これは不可能です。

私は、値に合わせるためにキー名を再割り当てすることが可能かもしれないと考えています。

ので、例えば

dict = {"0": {"0": "color", "1": 3}, "1": {"0": "plant_variety", "1": 3}, "2": {"0": "design", "1": 4}, "3": {"0": "maintenance", "1": 4}, "4": {"0": "environmental_stewardship", "1": 4}} 

ではなく、したがって

dict = {"0": {"0": "color", "1": 3}, "4": {"0": "plant_variety", "1": 3}, "1": {"0": "design", "1": 4}, "3": {"0": "maintenance", "1": 4}, "2": {"0": "environmental_stewardship", "1": 4}} 

なるdict["0"]のために、私はいつも、サブ辞書/値の "色" を持ちたい、dict["1"]は常に「デザインを持っているでしょう"などです。したがって、私の例では、dict["0"]は、{"0": "color", "1": 3}dict["1"]となり、{"0": "design", "1": 4}などとなります。

したがって、私はvalue/subディクショナリにあるものに基づいてキーを再割り当てしようとしています。キー「0」は常にサブ辞書/値に「色」を有し、キー「1」は常に上記の辞書の辞書全体に対して「デザイン」等を有する。

私はこれを見つけましたが、値/サブ辞書の内容に依存しているため、このオブジェクトはこれを行う方法が混乱しています。

私は、 'use_of_color'などの値が 'color'などに変更されていることを確認することに対処する必要があることを知っています。私はちょうど私が常に同じキーで '色'の値を持つサブ辞書を抽出していることを確認する方法が必要です、そして私はこれを行うことがわかる唯一の方法は、キーを再割り当てすることです。

これに対処するより良い方法がある場合は、私は提案に開放しています。

+0

ああ、私はあなたの要件を誤解していました。キー0の値でグループ化したい場合 –

+0

ああ、私も同様でしたが、私はまだよく分かりません。予想通りの出力を提供することができますか? – mitoRibo

+0

ええ、ええ、今私はちょうどあなたが望むものとして完全に混乱しています。 –

答えて

2

私はあなたのキー '0'の値、すなわち 'location'、 'environmental_stewardship'などでサブディクショナリをグループ化したいとします。しかし実際には、サブディクショナリはまったく持っていません辞書リテラルの文字列があります。あなたの辞書がhorrible_mess命名した場合、あなたはこのクイックハック使用することもできます。次に

>>> from ast import literal_eval 
>>> still_messy = {k:literal_eval(v) for k,v in horrible_mess.items()} 

を、それが最も簡単には、単に次の操作を実行するために、おそらくです:

>>> from collections import defaultdict 
>>> grouped = defaultdict(list) 
>>> for sub in still_messy.values(): 
...  for d in sub.values(): 
...   grouped[d['0']].append(d) 
... 
>>> grouped['visual_appeal'] 
[{'1': '4', '0': 'visual_appeal'}, {'1': '3', '0': 'visual_appeal'}] 
>>> grouped['environmental_stewardship'] 
[{'1': '3', '0': 'environmental_stewardship'}, {'1': '2', '0': 'environmental_stewardship'}, {'1': 4, '0': 'environmental_stewardship'}, {'1': '2', '0': 'environmental_stewardship'}, {'1': '3', '0': 'environmental_stewardship'}, {'1': '4', '0': 'environmental_stewardship'}, {'1': '1', '0': 'environmental_stewardship'}, {'1': 2, '0': 'environmental_stewardship'}, {'1': '4', '0': 'environmental_stewardship'}, {'1': '4', '0': 'environmental_stewardship'}, {'1': '3', '0': 'environmental_stewardship'}, {'1': '3', '0': 'environmental_stewardship'}, {'1': '1', '0': 'environmental_stewardship'}, {'1': '4', '0': 'environmental_stewardship'}] 
>>> 
+0

はい、辞書リテラルはサブ辞書ではありません。これは私がこれをやることを構想する方法ではありませんが、私が必要とするものです。 –

+0

ユースケースでは、すべての 'visual_appeals'、 'environmental_stewardship'などを互いにプロットする必要があります(辞書リテラル内のキーはすべて「1」のスコアです)、キーでグループ化すると役立ちます辞書リテラル内のキー値のペアをよりよくフィルタリングします。 horrible_mess、確かに、これは私をそこに連れて行きます。 –

+0

'grouped = defaultdict([])'は 'TypeError:最初の引数は呼び出し可能でなければなりません.'というエラーを返します。解決策は' list'型を 'defaultdict(list)'として明示的に記述することです。それ以外の場合はうまくいく。 –

1

これはあなたが期待する出力である場合は私に知らせてくださいあなたの質問に期待される結果を含めてください。私はコードが醜いことをお詫びしますが、基本的にはすべてのサブ辞書をループし、intに変換できない値(これはハックです)だけを考慮し、新しい辞書のキーとしてそれらを使用します。

CODE:

from ast import literal_eval 
data = {0: '{"0": {"0": "use_of_color", "1": "3"}, "1": {"0": "plant_variety", "1": "2"}, "2": {"0": "design", "1": "2"}, "3": {"0": "maintenance", "1": "2"}, "4": {"0": "environmental_stewardship", "1": "3"}}', 
1: '{"0": {"0": "use_of_color", "1": "3"}, "1": {"0": "plant_variety", "1": "2"}, "2": {"0": "design", "1": "3"}, "3": {"0": "maintenance", "1": "4"}, "4": {"0": "environmental_stewardship", "1": "2"}}', 
2: '{"0": {"0": "color", "1": 3}, "1": {"0": "plant_variety", "1": 3}, "2": {"0": "design", "1": 4}, "3": {"0": "maintenance", "1": 4}, "4": {"0": "environmental_stewardship", "1": 4}}', 
3: '{"0": {"0": "location", "1": "4"}, "1": {"0": "sizing", "1": "4"}, "2": {"0": "design", "1": "3"}, "3": {"0": "maintenance", "1": "3"}, "4": {"0": "visual_appeal", "1": "4"}}', 
4: '{"0": {"0": "visual_impact", "1": "3"}, "1": {"0": "plant_variety_and_health", "1": "4"}, "2": {"0": "design", "1": "3"}, "3": {"0": "maintenance", "1": 0}, "4": {"0": "environmental_stewardship", "1": "2"}}', 
5: '{"0": {"0": "location", "1": "3"}, "1": {"0": "sizing", "1": "3"}, "2": {"0": "design", "1": "3"}, "3": {"0": "maintenance", "1": "3"}, "4": {"0": "visual_appeal", "1": "3"}}', 
56: '{"0": {"0": "visual_impact", "1": "2"}, "1": {"0": "plant_variety_and_health", "1": "3"}, "2": {"0": "design", "1": "1"}, "3": {"0": "maintenance", "1": "2"}, "4": {"0": "environmental_stewardship", "1": "1"}}', 
57: '{"0": {"0": "color", "1": 3}, "1": {"0": "plant_variety", "1": 2}, "2": {"0": "design", "1": 1}, "3": {"0": "maintenance", "1": 2}, "4": {"0": "environmental_stewardship", "1": 2}}', 
58: '{"0": {"0": "visual_impact", "1": "4"}, "1": {"0": "plant_variety_and_health", "1": "3"}, "2": {"0": "design", "1": "4"}, "3": {"0": "maintenance", "1": "3"}, "4": {"0": "environmental_stewardship", "1": "4"}}', 
59: '{"0": {"0": "visual_impact", "1": "3"}, "1": {"0": "plant_variety_and_health", "1": "3"}, "2": {"0": "design", "1": "3"}, "3": {"0": "maintenance", "1": "3"}, "4": {"0": "environmental_stewardship", "1": "4"}}', 
60: '{"0": {"0": "use_of_color", "1": "3"}, "1": {"0": "plant_variety", "1": "4"}, "2": {"0": "design", "1": "3"}, "3": {"0": "maintenance", "1": "2"}, "4": {"0": "environmental_stewardship", "1": "3"}}', 
61: '{"0": {"0": "use_of_color", "1": "3"}, "1": {"0": "plant_variety", "1": "4"}, "2": {"0": "design", "1": "3"}, "3": {"0": "maintenance", "1": "2"}, "4": {"0": "environmental_stewardship", "1": "3"}}', 
62: '{"0": {"0": "visual_impact", "1": "2"}, "1": {"0": "plant_variety_and_health", "1": "2"}, "2": {"0": "design", "1": "2"}, "3": {"0": "maintenance", "1": "1"}, "4": {"0": "environmental_stewardship", "1": "1"}}', 
63: '{"0": {"0": "visual_impact", "1": "4"}, "1": {"0": "plant_variety_and_health", "1": "3"}, "2": {"0": "design", "1": "3"}, "3": {"0": "maintenance", "1": "4"}, "4": {"0": "environmental_stewardship", "1": "4"}}', 
64: '{"0": {"0": "visual_impact", "1": "4"}, "1": {"0": "plant_variety_and_health", "1": "3"}, "2": {"0": "design", "1": "3"}, "3": {"0": "maintenance", "1": "4"}, "4": {"0": "environmental_stewardship", "1": "4"}}', 
65: '{"0": {"0": "visual_impact", "1": "3"}, "1": {"0": "plant_variety_and_health", "1": "3"}, "2": {"0": "design", "1": "3"}, "3": {"0": "maintenance", "1": "2"}, "4": {"0": "environmental_stewardship", "1": "3"}}'} 


sep_by_type = {} 
for key1,val1 in data.iteritems(): 
    val1 = literal_eval(val1) #because val1 is a string not a dict 
    for key2,val2 in val1.iteritems(): 
     for key3,val3 in val2.iteritems(): 
      try: 
       int(val3) 
      except: 
       if val3 not in sep_by_type: 
        sep_by_type[val3] = [val2] 
       else: 
        sep_by_type[val3].append(val2) 

for sep_key in sep_by_type: 
    print sep_key,sep_by_type[sep_key] 
    print "" 

OUTPUT

sizing [{'1': '4', '0': 'sizing'}, {'1': '3', '0': 'sizing'}] 

plant_variety [{'1': '2', '0': 'plant_variety'}, {'1': '2', '0': 'plant_variety'}, {'1': 3, '0': 'plant_variety'}, {'1': 2, '0': 'plant_variety'}, {'1': '4', '0': 'plant_variety'}, {'1': '4', '0': 'plant_variety'}] 

maintenance [{'1': '2', '0': 'maintenance'}, {'1': '4', '0': 'maintenance'}, {'1': 4, '0': 'maintenance'}, {'1': '3', '0': 'maintenance'}, {'1': 0, '0': 'maintenance'}, {'1': '3', '0': 'maintenance'}, {'1': '2', '0': 'maintenance'}, {'1': '4', '0': 'maintenance'}, {'1': '2', '0': 'maintenance'}, {'1': 2, '0': 'maintenance'}, {'1': '3', '0': 'maintenance'}, {'1': '3', '0': 'maintenance'}, {'1': '2', '0': 'maintenance'}, {'1': '2', '0': 'maintenance'}, {'1': '1', '0': 'maintenance'}, {'1': '4', '0': 'maintenance'}] 

use_of_color [{'1': '3', '0': 'use_of_color'}, {'1': '3', '0': 'use_of_color'}, {'1': '3', '0': 'use_of_color'}, {'1': '3', '0': 'use_of_color'}] 

color [{'1': 3, '0': 'color'}, {'1': 3, '0': 'color'}] 

plant_variety_and_health [{'1': '4', '0': 'plant_variety_and_health'}, {'1': '3', '0': 'plant_variety_and_health'}, {'1': '3', '0': 'plant_variety_and_health'}, {'1': '3', '0': 'plant_variety_and_health'}, {'1': '3', '0': 'plant_variety_and_health'}, {'1': '3', '0': 'plant_variety_and_health'}, {'1': '2', '0': 'plant_variety_and_health'}, {'1': '3', '0': 'plant_variety_and_health'}] 

visual_appeal [{'1': '4', '0': 'visual_appeal'}, {'1': '3', '0': 'visual_appeal'}] 

design [{'1': '2', '0': 'design'}, {'1': '3', '0': 'design'}, {'1': 4, '0': 'design'}, {'1': '3', '0': 'design'}, {'1': '3', '0': 'design'}, {'1': '3', '0': 'design'}, {'1': '3', '0': 'design'}, {'1': '3', '0': 'design'}, {'1': '1', '0': 'design'}, {'1': 1, '0': 'design'}, {'1': '4', '0': 'design'}, {'1': '3', '0': 'design'}, {'1': '3', '0': 'design'}, {'1': '3', '0': 'design'}, {'1': '2', '0': 'design'}, {'1': '3', '0': 'design'}] 

location [{'1': '4', '0': 'location'}, {'1': '3', '0': 'location'}] 

environmental_stewardship [{'1': '3', '0': 'environmental_stewardship'}, {'1': '2', '0': 'environmental_stewardship'}, {'1': 4, '0': 'environmental_stewardship'}, {'1': '2', '0': 'environmental_stewardship'}, {'1': '3', '0': 'environmental_stewardship'}, {'1': '4', '0': 'environmental_stewardship'}, {'1': '1', '0': 'environmental_stewardship'}, {'1': 2, '0': 'environmental_stewardship'}, {'1': '4', '0': 'environmental_stewardship'}, {'1': '4', '0': 'environmental_stewardship'}, {'1': '3', '0': 'environmental_stewardship'}, {'1': '3', '0': 'environmental_stewardship'}, {'1': '1', '0': 'environmental_stewardship'}, {'1': '4', '0': 'environmental_stewardship'}] 

visual_impact [{'1': '3', '0': 'visual_impact'}, {'1': '3', '0': 'visual_impact'}, {'1': '4', '0': 'visual_impact'}, {'1': '2', '0': 'visual_impact'}, {'1': '4', '0': 'visual_impact'}, {'1': '3', '0': 'visual_impact'}, {'1': '2', '0': 'visual_impact'}, {'1': '4', '0': 'visual_impact'}] 

UPDATE 私は安全ですliteral_evalの代わりにevalを使用。 (ありがとうjuanpa.arrivillaga!)

+0

これは最終的にそこに私を得るだろうと思うが、@ juanpa.arrivillagaはparsimonyな解決策を持っています。 –

+0

私は、各 "sep_key"を一意に識別するための別のキーと値のペアとして、グループ化された出力に "マスター"キー(つまり、0,1,2、...、65)を埋め込むようにしようとしています。あなたや@ juanpa.arrivillagaがこれを処理する方が簡単かどうかはわかりません。 –

関連する問題