Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 加入一个目录_Python_List_Sorting_Dictionary_Union - Fatal编程技术网

Python 加入一个目录

Python 加入一个目录,python,list,sorting,dictionary,union,Python,List,Sorting,Dictionary,Union,我有一些这样的口述: 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']),..

我有一些这样的口述:

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、相同shadershader1的新列表,并且geom将是
['a'、'b'、'c'、'd']
谢谢你的帮助


编辑:承认我可以改变这种糟糕的数据结构,我应该使用什么样的结构来让事情变得更简单?我唯一想做的就是保留层次结构:一个RL可以包含许多着色器,这些着色器可以包含许多几何体,我可以有许多这样的条目。

按照您的数据结构,我得到了这个

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”
,那么我将转到另一个类似这样的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'))
,或者像我所做的那样使用
{}
语法


哇。。。天哪。。。很抱歉这么说。

粘贴在这里的代码不是Python。纠正你的数据结构好吧,我只是太急了,没能把它写好。。。我在使用dict()命令时使用equals。对不起,我改正了it@AshwiniChaudhary是的,
dict
是类型,传递给它的任何关键字参数都将成为键/值对
dict(foo='bar')
{'foo':'bar'}
@MartijnPieters实际上他编辑了他以前的
dict()
声明,这是不正确的。啊,检查一下。仍然存在语法错误。@KevinEaverquepedo我认为dict列表正是您编写数据结构的方式。我的答案不会在同一个RL上组合多个着色器。我将在稍后对其进行编辑。好吧,即使更改您的解决方案有意义的所有内容很痛苦。。。。最好是能够为所有使用它的代码保留我的旧数据结构,并将其转换为新的数据结构,这样我就可以使用此结构执行新操作和代码。我会调查的。非常感谢@KevinEaverquepedo我认为我的上一次编辑应该可以让你很容易地做到这一点。我认为它是有效的,但似乎没有。。。如果不是您的5个列表(每个列表只包含一个渲染层,这对我来说不是),而是我从列表1和列表2获取一个列表,但在列表2中用rl3替换rl1,然后从列表3和列表4获取一个列表,它会输出以下内容:[[[{'RL':'rl1','shaders':[{'geom':['a','b'],'shader':'shader1'},{'geom':['q','p'],'shader':'shader3'}]},{'RL':'rl3','shaders':[{'geom':['c','d'],'shader1'},{'geom':['x','y'],'shader3'}]}]也许我的列表很混乱,因为我每个列表只放了一个,对不起…你说的是你不认为我的答案(解决了你原来的问题,第二个问题[通过评论],并解决了您的编辑)不再值得接受。你在开玩笑吧?违背我的判断,我要编辑这个,但是天啊,路易斯。。。一个男人该怎么办?