2010-11-19 14 views
12

처음에는 각 셀에 None을 사용하여 6x5 2 차원 배열을 만듭니다. 그런 다음 파일을 읽고 Nones를 데이터로 대체합니다. 데이터가 정의되지 않은 순서로 읽었으므로 먼저 빈 배열을 만듭니다. 내 첫 번째 시도는 내가 그랬어이 : 지금 목록에 * 연산자 대신 사본의 참조를 만들 수 있기 때문에 이해 좀 이상한 오류의 결과 파이썬에서 2 차원 행렬 만들기

x = [[None]*5]*6 

.

이 빈 배열을 쉽게 만들 수있는 라이너가 있습니까? 루프 용으로 만들 수도 있고 빌드 할 수도 있지만 파이썬에 대해서는 불필요하게 자세한 정보를 제공합니다.

+3

, 당신은 적어도 NumPy와이 있는지 알고 있어야합니다 : HTTP : //numpy.scipy.org/ 물론 중첩 된 목록에는 아무런 문제가 없으며 numpy와 같은 (큰) 종속성을 추가하는 것이 항상 좋은 것은 아닙니다. 그러나, 당신이 그것에 대해 이미 알지 못한다면, 이제 당신은 그렇게합니다! –

답변

22

사용하여 중첩 된 이해 목록 :

x = [[None for _ in range(5)] for _ in range(6)] 
19

여기에서 일어나고은 라인

x = [[None]*5]*6 

당신이 (6)와 목록이이 시점에서

x = [[None, None, None, None, None, None]]*6 

에게 확장이다 싱글 톤 None에 대한 다른 참조. 첫 번째 항목과 유일한 항목이므로 내부 목록에 대한 참조가있는 목록도 있습니다. 6을 곱하면 내부 목록에 대한 참조가 5 개 더 늘어납니다. 그러나 요점은 내부 목록에 문제가 없으므로 외부 목록의 구성을 확장하여 이해할 필요가 없다는 것입니다.

x = [[None]*5 for _ in range(6)] 

이렇게하면 모든 목록에 대한 참조가 중복되는 것을 피할 수 있습니다. 이는 필자가 믿을 수있을 정도로 간결합니다.

1

당신이 NumPy와 경로를하지 않을 경우, 당신은 사전 가짜 2D 배열 할 수

당신은 N 차원 배열을 처리하는 경우
>>> x = dict(((i,j),None) for i in range(5) for j in range(6)) 
>>> print x[3,4] 
None 
관련 문제