2012-05-28 41 views
0

我有一個這樣類型的字典一些名單:加入類型的字典列表

list1 = [ 
    dict(RL = 'rl1', 
     shaders = [dict(shader = "shader1", geom = ['a1','b1']), 
     dict(shader = "shader2", geom = ['a2','b2'])]), 
    dict(RL = 'rl3', 
     shaders = [dict(shader = "shader1", geom = ['c','d']),...])  
] 
list2 = [ 
    dict(RL = 'rl1', 
     shaders = [dict(shader = "shader1", geom = ['p1','q1']), 
     dict(shader = "shader3", geom = ['p3','q3'])]), 
    dict(RL = 'rl2', 
     shaders = [dict(shader = "shader1", geom = ['c','d']),...])  
] 

所以它的類型的字典列表,其中每個字典具有包含類型的字典列表中的一個值。 我知道這並不是最好的數據結構,但現在改變這種方式會非常耗時。我想通過它們的RL值加入所有這些列表,然後如果着色器值相同,請將geom列表一起加入。 因此,例如上面的列表,假設只有條目是我寫下來的,我會得到我的同renderlayer RL1,相同的着色器shader1新的列表,以及GEOM將['a','b','c','d'] 感謝您的幫助

編輯:承認我可以改變這個不好的數據結構,我應該用什麼樣的結構來讓我更容易?我唯一想要的是保持層次結構:一個RL可以包含許多可以包含許多geoms的着色器,並且我可以有許多這樣的入口。

+3

這裏粘貼的代碼不是Python。改正你的數據結構 – Boud

+0

'='在字典中? –

+0

好吧我只是太急於寫好它......當我使用dict()命令時,我使用了等號。對不起,我糾正了它 –

回答

0

與您的數據結構的堅持,我得到這個...

list1 = [dict(RL = 'rl1', shaders = [dict(shader = "shader1", geom = ['a','b']), 
            dict(shader = "shader3", geom = ['q','p'])])] 
list2 = [dict(RL = 'rl1', shaders = [dict(shader = "shader1", geom = ['c','d']), 
            dict(shader = "shader3", geom = ['x','y'])])] 
list3 = [dict(RL = 'rl1', shaders = [dict(shader = "shader2", geom = ['e','f'])])] 
list4 = [dict(RL = 'rl2', shaders = [dict(shader = "shader2", geom = ['g','h'])])] 
list5 = [dict(RL = 'rl2', shaders = [dict(shader = "shader2", geom = ['i','j'])]), 
     dict(RL = 'rl3', shaders = [dict(shader = "shader4", geom = ['ab','cd'])])] 

list_o_lists = [list1, list2, list3, list4, list5] 

big_list_o_dicts = [] 
for x in list_o_lists: 
    big_list_o_dicts.extend(x) 

big_list_o_dicts.sort(key=lambda x: x['RL']) 

new_list_o_lists = [] 

last_item = None 
for item in big_list_o_dicts: 
    if last_item and item['RL'] == last_item['RL']: 
     for this_shader in item['shaders']: 
      for last_shader in last_item['shaders']: 
       if last_shader['shader'] == this_shader['shader']: 
        last_shader['geom'].extend(this_shader['geom']) 
        break 
    else: 
     last_item = item 
     new_list_o_lists.append(last_item) 

它看起來瘋狂,肯定有更有效的辦法,但也許它會幫助你。

編輯:在回答您的編輯,除非有一些理由讓所有這些名單分開,你的最終願望,他們都結合起來表明,它會更容易維護,你從一開始就想要的結構。

喜歡的東西...

rl_shader_map = { 
    'rl1': { 
     'shader1': ['a', 'b', 'c', 'd'], 
     'shader2': ['e', 'f'], 
    }, 
    'rl2': { 
     'shader2': ['g', 'h', 'i', 'j'] 
    } 
} 

使得檢查在渲染層更容易(而不是迭代,這是一個哈希表查找)的着色器。

每當您創建一個全新的列表對象時,只需在上面的地圖中追加或創建相應的頻道即可。

如果您需要維護的不僅僅是"geom"每個着色器的詳細信息,然後我會移動到像這樣字典另一...

rl_shader_map = { 
    'rl1': { 
     'shader1': { 
      'geom': ['a', 'b', 'c', 'd'], 
     } 
     'shader2': { 
      'geom': ['e', 'f'], 
     } 
    }, 
    'rl2': { 
     'shader2': { 
      'geom': ['g', 'h', 'i', 'j'], 
     } 
    } 
} 

而且,只是作爲一個風格上看,使用kwarg字典創造是相當未用的AFAIK,所以我會傳遞一個鍵值元組iterable如dict([('RL', 'rl1'), ('shader', 'shader1')])或使用{}語法,因爲我已經完成了。

哇......聖潔的廢話......抱歉的咆哮。

+0

好吧我會嘗試午餐後。非常感謝! –

+0

@KevinEaverquepedo我以爲列表中的字典就是你寫數據結構的方式。我的答案不會在同一個RL上組合多個着色器。我會稍微編輯它。 – mayhewr

+0

感謝您的幫助我將等待您的編輯 –

相關問題