2016-09-12 6 views
0

これをより科学的に表現するための正確な単語がわからないので、私の貧弱な文法で私を助けてください。辞書のリストの列数を増やす

私の問題は次のとおりです。私はそうのような辞書のリストからテーブルを構築しています

for d in listDictionary: 
    print d 

{'key1':'value11', 'key2':'value12', ..., 'keyM':'value1M'} 
{'key1':'value21', 'key2':'value22', ..., 'keyM':'value2M'} 
... 
{'key1':'valueN1', 'key2':'valueN2', ..., 'keyM':'valueNM'} 

簡単にするために、あなたはN*Mマトリックスとしてこれを想像することができます。これと同じように:

key1  key2  ... keyM 
value11 value12 ... value1M 
value21 value22 ... value2M 
... 
valueN1 valueN2 ... valueNM 

、ここで本当の問題です。値の中にはさらに処理が必要なものもありますが、どれだけ多くの値があるかは必ずしも分かりません。たとえば、 はkeyKからIthの値を選択します。 0<K<M, 0<I<Nですので、valueIKです。

valueIKは、n/aのいずれかになります。siblingschildrenのツリーを表します。

ツリー表現は、このようなものです:

root1 
    -> somevalue1 

root2 
    -> somevalue2 

root3 
    -> somevalue3 

だから、プレーンテキストで、valueIKは次のようになります。root1>somevalue1;root2>somevalue2;root3>somevalue3; valueIKが最初の仮定よりも多くのアイテムを持っているので、私は行列/ listDictionaryを拡張できるようにしたいです。しかし、辞書のサイズを一定に保つためには、リスト内の他の項目も更新する必要があります。

ex。我々は初期行列としてこれを持っている場合、私はこのような何かを達成したい

key1  key2  ... keyK ... keyM 
value11 value12 ...   ... value1M 
value21 value22 ...   ... value2M 
...      valueIK 
valueN1 valueN2 ...   ... valueNM 

:つまり

key1  key2  ... keyK  root1   root2   ... keyM 
value11 value12 ...   n/a    whatevervalue ... value1M 
value21 value22 ...   someothervalue n/a   ... value2M 
...      valueIK somevalue1  n/a 
valueN1 valueN2 ...   n/a    helloWorld ... valueNM 

を、エントリかもしれないの残りの部分は、キーroot_の下にいくつかの値を持っており、 we do notそれらを変更したいのですが、何も持っていない場合は、マトリックスセルを埋める必要があります'n/a'

ごめんなさいry長い技術的なポスト。私は可能な限り分析的になるように努めた。 これを私自身で行う方法を見つけることができないので、私は助けを求めています。

おかげで:)

+0

SHあなたの最初の試みは、この問題を理解するのに役立つでしょう。 –

+0

「valueIK」の各部分がテーブルから直接アクセスできるようにするのはなぜか分かりません。テーブル内のツリーのポイントは、テーブル内のその単一ポイントからすべてのサブノードを参照できるようにすることだと思います。 –

答えて

0

まず、簡単な答えは:

あなただけの設定解除の値を設定したい場合は、dict.setdefault方法があります。例えば、5行目(value52value51含む、など)としてdict5を与え、そしてあなたは、列root1更新すること:しかし

# returns the value of dict5['root1'], setting it to 'n/a' if it didn't exist at all 
dict5.setdefault('root1', 'n/a') 

、注意を:あなたは外にあなたのテーブルを構築しているので、ほとんどの場合、未使用のものを'n/a'に設定する必要はありません。実際には辞書をチェックしていないので、1つの辞書の要素の設定を解除し、別の辞書の要素を安全に設定することができます。これによりメモリが節約され、すべての空の設定に時間を費やす必要はありません。

# Returns dict5['root1'], but returns 'n/a' if that doesn't exist. 
dict5.get('root1', 'n/a') 

あなたは、しかし、あなたはどこかにすべての列の別のリストを維持する必要がありますないという場合は、ループ:ちょうどあなたが物事を取得しているとき、あなたはget代わりの[]、例えばを使用していることを確認してくださいそれによって、あなたが以前例えば、何らかの方法で各辞書をループしている場合:

# Prints each cell of the table on a new line, including 'n/a' for empty cells 
columns = ['key1', 'key2', 'key3'] 
for d in listDictionary: 
    for c in columns: 
     print d.get(c, 'n/a') 

# Instead of: 
for d in listDictionary: 
    for c in d: # Only gets the keys that exist in that particular dict, so no 'n/a's 
     print d.get[c] 
0

私は、おそらくこれがうまくいくかもしれない、正しく質問を理解している場合:

data = [ 
    { 'k1': 'root3>rv11;root1>rv12', 'k2': 'v12', 'k3': 'v13'}, 
    { 'k1': 'v21', 'k2': 'root1>rv21;root2>rv22;', 'k3': 'v23'}, 
    { 'k1': 'v31', 'k2': 'v32', 'k3': 'root2>rv32;'} 
] 

newkeys = set() 
for item in data: 
    add = {} 

    for k, v in item.items(): 
     if '>' in v: 
      fields = v.strip(';').split(';') 
      add.update(dict(f.split('>') for f in fields)) 

    newkeys |= set(add.keys()) 

    item.update(add) 

for nk in newkeys: 
    for item in data: 
     if nk not in item: 
      item[nk] = None  

print(data) 
関連する問題