2017-09-08 5 views
1

예를 들어, 나는 방법에 있습니까슬라이스 단순 목록 효율적으로

[1, 2, 3, 4, 5, 6, 7, 8, 9, 'A', 'B', 'C', 'D', 'E', 'F', 'G'] 

내가 4-깊은 목록

[[[[1, 2], [3, 4]], [[5, 6], [7, 8]]], [[[9, 'A'], ['B', 'C']], [['D', 'E'] ['F', 'G']]]] 

로 변환 할 단순 목록을 가지고 모든 레벨에 대해 별도의 변수를 만들지 않고합니까? 메모리와 성능면에서 가장 효율적인 방법은 무엇입니까?

업데이트 : 또한 비대칭 방식으로 처리 할 수 ​​있습니까?

[[[[1, 2, 3], 4], [[5, 6, 7], 8]]], [[[9, 'A', 'B'], 'C']], [['D', 'E', 'F'], 'G']]]] 

답변

2

첫 번째 목록에는 16 개가 아닌 15 개의 요소가 있습니다. 또한 A은 무엇이되어야합니까? 다른 곳에서 정의한 상수입니까? 그냥 문자열이라고 가정합니다 : 'A'.

당신이 np.arrays와 함께 작업하는 경우, 당신은 할 수 단순히 reshape 배열 :

import numpy as np 
r = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 'A', 'B', 'C', 'D', 'E', 'F', 'G']) 
r.reshape(2,2,2,2) 

그것은 출력 : NumPy와는 기본 데이터 형식을 변경하지 않기 때문에

array([[[['1', '2'], 
     ['3', '4']], 

     [['5', '6'], 
     ['7', '8']]] 


     [[['9', 'A'], 
     ['B', 'C']], 

     [['D', 'E'], 
     ['F', 'G']]] 
     dtype='<U11') 

이 정말 효율적이어야한다. 다르게 표시되는 여전히 편평한 배열입니다.

Numpy는 불규칙한 모양을 지원하지 않습니다. 다음은 표준 파이썬 목록으로 작업해야합니다.

i = iter([1, 2, 3, 4, 5, 6, 7, 8, 9, 'A', 'B', 'C', 'D', 'E', 'F', 'G']) 

l1 = [] 

for _ in range(2): 
    l2 = [] 
    for _ in range(2): 
     l3 = [] 
     l4 = [] 
     for _ in range(3): 
      l4.append(next(i)) 
     l3.append(l4) 
     l3.append(next(i)) 
     l2.append(l3) 
    l1.append(l2) 

print(l1) 
# [[[[1, 2, 3], 4], [[5, 6, 7], 8]], [[[9, 'A', 'B'], 'C'], [['D', 'E', 'F'], 'G']]] 

앞에서 말한 것처럼 각 수준에 대한 임시 변수를 정의해야합니다. 나는 당신이리스트 comprehensions를 사용할 수 있었다고 생각한다. 그러나 그들은 귀여울 것이다.

+0

고마워요! 그러나이 기술을 사용하면 각 레벨에 고정 된 수의 요소로 제한됩니다. 맞습니까? 나는 그에 따라 게시물을 편집 할 예정이다. 불쌍한 질문에 대해 미안하다. – Cons