加入列表字典

2024-10-02 20:38:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些这样的口述:

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']),...])     
]

所以这是一个dict列表,其中每个dict都有一个包含dict列表的值。 我知道这并不是有史以来最好的数据结构,但现在改变它将是相当耗时的。我想通过它们的RL值来连接所有这些列表,然后如果着色器值相同,将geom列表连接在一起。 例如,对于上面的列表,假设只有我写下的条目,我会得到具有相同renderlayer rl1、相同着色器shader1的新列表,geom将是['a','b','c','d'] 谢谢你的帮助

编辑:承认我可以改变这个糟糕的数据结构,我应该使用什么样的结构来让事情变得更简单?我唯一想要的是保持层次结构:一个RL可以包含许多着色器,其中可以包含许多geom,而且我可以有许多这样的条目。在


Tags: 数据结构列表a1条目dictb1rl着色器
1条回答
网友
1楼 · 发布于 2024-10-02 20:38:15

坚持你的数据结构,我得到了这个。。。在

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)

这看起来很疯狂,当然还有更有效的方法,但也许它会帮到你。在

编辑:对于您的编辑,除非有什么理由将所有这些列表分开,否则您最终希望将它们合并起来,这表明从一开始就可以更容易地维护所需的结构。在

像是。。。在

^{pr2}$

使检查渲染层中的着色器更容易(而不是迭代,而是哈希表查找)。在

每当你想创建一个全新的列表对象时,只需在上面的映射中附加或创建适当的通道。在

如果您需要为每个着色器维护更多的信息,而不仅仅是"geom",那么我将转到另一个dict,如这样。。。在

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

同样,作为一个样式点,使用kwarg dict创建是非常没有用的,所以我将传递一个iterable的键值元组,比如dict([('RL', 'rl1'), ('shader', 'shader1')]),或者像我以前一样使用{}语法。在

哇。。。天哪。。。很抱歉你的咆哮。在

相关问题 更多 >