본문 바로가기

개발하자

파이썬에서 중첩 목록을 만드는 방법은 무엇인가요?

반응형

파이썬에서 중첩 목록을 만드는 방법은 무엇인가요?

다음과 같이 파이썬에서 쉽게 중첩된 목록을 만들 수 있다는 것을 알고 있습니다:

[[1,2],[3,4]]

그러나 어떻게 3x3x3 0 행렬을 만들 수 있을까?

[[[0] * 3 for i in range(0, 3)] for j in range (0,3)]

또는

[[[0]*3]*3]*3

뭔가 잘못된 것 같아요. 치수 목록을 메소드에 전달하는 것만으로 작성할 수 있는 방법은 없습니까? 예:

CreateArray([3,3,3])



곱셈 구문만 네스트하면 됩니다:

[[[0] * 3] * 3] * 3

따라서 이 연산을 표현하는 것은 간단합니다

def zeros(dimensions):
    return reduce(lambda x, d: [x] * d, [0] + dimensions)

또는 참조 복제를 방지하려면 한 항목을 변경해도 다른 항목에는 영향을 미치지 않으므로 복사본을 사용해야 합니다:

import copy
def zeros(dimensions):
    item = 0
    for dimension in dimensions:
        item = map(copy.copy, [item] * dimension)
   return item



NumPy는 이 문제를 해결합니다

링크

>>> a = array( [2,3,4] )
>>> a
array([2, 3, 4])
>>> type(a)
<type 'numpy.ndarray'>

그러나 파이썬 네이티브 목록을 행렬로 사용하려면 다음과 같은 도움말 방법이 유용할 수 있습니다:

import copy

def Create(dimensions, item):
    for dimension in dimensions:
        item = map(copy.copy, [item] * dimension)
    return item
def Get(matrix, position):
    for index in position:
        matrix = matrix[index]
    return matrix
def Set(matrix, position, value):
    for index in position[:-1]:
        matrix = matrix[index]
    matrix[position[-1]] = value



만약 행렬이 실제로 당신이 찾고 있는 것이라면, numpy 패키지를 생각해 보세요.

http://docs.scipy.org/doc/numpy/reference/generated/numpy.zeros.html#numpy.zeros

이렇게 하면 3x3x3의 0 배열을 얻을 수 있습니다:

numpy.zeros((3,3,3)) 

또한 과학적 컴퓨팅을 위해 제작된 모듈의 편리한 기능을 활용할 수 있습니다.




목록 이해는 목록 초기화에 표현력을 추가하기 위한 통사적 당이다. 당신의 경우, 나는 그것들을 전혀 사용하지 않고 단순한 중첩 루프를 사용할 것이다.

완전히 다른 레벨에서: 목록을 사용하여 다차원 행렬을 구현할 수 있지만, 그 목표에 가장 적합한 도구는 아니라고 생각합니다.




또는 정의된 네스트 함수를 반복 도구 모듈의 repeat (0)과 함께 사용합니다:

nest(itertools.repeat(0),[3,3,3])

반응형