2012-05-28 4 views
0

이 같은 dicts의 일부 목록이 있습니다dicts의 목록을 가입하면

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

이 때문에 각 딕셔너리는 dicts의 목록이 포함 된 값 중 하나를 가지고 dicts의 목록입니다합니다. 나는 그것이 최고의 데이터 구조는 아니지만 지금은 그것을 바꾸는 데 꽤 많은 시간이 걸린다는 것을 알고 있습니다. 이 모든 목록을 RL 값으로 결합하고 싶습니다. 그리고 셰이더 값이 같으면 함께 기하 목록을 결합하십시오. 유일한 항목을 가정 그래서 위의 목록에 대한 예를 들어 는, 내가 같은 renderlayer의 RL1, 같은 쉐이더 shader1 내 새 목록을 얻을 것입니다, 내가 적어 것들, 그리고 기하 구조는 도움

에 대한 ['a','b','c','d'] 감사 것 편집 : 인정이 나쁜 데이터 구조를 변경할 수 있습니다, 어떤 종류의 구조를 사용하면 좀 쉽게 나를 위해 사용할 수 있습니까? 내가 원하는 유일한 것은 계층 구조를 유지하는 것입니다 : 하나의 RL은 많은 기하 구조를 포함 할 수있는 많은 셰이더를 포함 할 수 있으며, 이와 같은 많은 항목을 가질 수 있습니다.

+3

여기 붙여 넣은 코드는 파이썬이 아닙니다. 데이터 구조를 수정하십시오 – Boud

+0

'='사전에? –

+0

괜찮 았는데 잘 쓰려고 너무 많이 서둘렀다 ... 나는 dict() 명령을 사용할 때 equals를 사용한다. 미안 해요. 제가 고치 셨습니다. –

답변

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의 DICT를 사용하여 스타일의 포인트로 생성은 꽤 사용되지 않는 AFAIK이므로 dict([('RL', 'rl1'), ('shader', 'shader1')])과 같은 키 - 값 튜플을 반복하거나구문을 사용합니다.

와우 ... 거룩한 쓰레기 ... 호언 장담에 대한 미안.

+0

괜찮습니다. 점심 식사 후에 시도해 보겠습니다. 고마워요! –

+0

@KevinEaverquepedo 나는 dicts의 목록이 당신이 데이터 구조를 작성한 방식이라고 생각했다. 내 대답은 같은 RL에 여러 쉐이더를 결합하지 않습니다. 나는 그것을 약간 편집 할 것이다. – mayhewr

+0

도움을 주셔서 감사합니다. –

관련 문제