[python] 파이썬에서 2 차원 배열을 초기화하는 방법?

나는 파이썬을 시작하고 있으며 2 차원 목록을 사용하려고합니다. 처음에는 모든 곳에서 동일한 변수로 채워집니다. 나는 이것을 생각해 냈다.

def initialize_twodlist(foo):
    twod_list = []
    new = []
    for i in range (0, 10):
        for j in range (0, 10):
            new.append(foo)
        twod_list.append(new)
        new = []

원하는 결과를 제공하지만 해결 방법처럼 느껴집니다. 이 작업을 더 쉽고 짧고 우아한 방법이 있습니까?



답변

파이썬에서 자주 등장한 패턴은

bar = []
for item in some_iterable:
    bar.append(SOME EXPRESSION)

목록 이해의 도입을 자극하여 해당 스 니펫을

bar = [SOME EXPRESSION for item in some_iterable]

더 짧고 때로는 더 명확합니다. 일반적으로이를 인식하고 루프를 이해력으로 대체하는 습관이 있습니다.

코드는이 패턴을 두 번 따릅니다.

twod_list = []                                       \
for i in range (0, 10):                               \
    new = []                  \ can be replaced        } this too
    for j in range (0, 10):    } with a list          /
        new.append(foo)       / comprehension        /
    twod_list.append(new)                           /


답변

당신은 목록 이해를 사용할 수 있습니다 :

x = [[foo for i in range(10)] for j in range(10)]
# x is now a 10x10 array of 'foo' (which can depend on i and j if you want)


답변

이 방법은 중첩 된 목록 이해보다 빠릅니다.

[x[:] for x in [[foo] * 10] * 10]    # for immutable foo!

다음은 작고 큰 목록에 대한 python3 타이밍입니다.

$python3 -m timeit '[x[:] for x in [[1] * 10] * 10]'
1000000 loops, best of 3: 1.55 usec per loop

$ python3 -m timeit '[[1 for i in range(10)] for j in range(10)]'
100000 loops, best of 3: 6.44 usec per loop

$ python3 -m timeit '[x[:] for x in [[1] * 1000] * 1000]'
100 loops, best of 3: 5.5 msec per loop

$ python3 -m timeit '[[1 for i in range(1000)] for j in range(1000)]'
10 loops, best of 3: 27 msec per loop

설명:

[[foo]*10]*1010 회 반복 된 동일한 객체의 목록을 만듭니다. 하나의 요소를 수정하면 각 행에서 동일한 요소가 수정되므로 이것을 사용할 수 없습니다!

x[:]list(X)이름 조회를 피하기 때문에 동등 하지만 조금 더 효율적입니다. 어느 쪽이든, 각 행의 얕은 사본을 작성하므로 이제 모든 요소가 독립적입니다.

모든 요소는 동일한 foo객체이므로 foo변경할 수 있으면 이 체계를 사용할 수 없습니다.

import copy
[[copy.deepcopy(foo) for x in range(10)] for y in range(10)]

또는 s Foo를 반환 하는 클래스 (또는 함수) 를 가정foo

[[Foo() for x in range(10)] for y in range(10)]


답변

사용하지 마십시오 [[v]*n]*n, 그것은 함정입니다!

>>> a = [[0]*3]*3
>>> a
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> a[0][0]=1
>>> a
[[1, 0, 0], [1, 0, 0], [1, 0, 0]]

그러나

    t = [ [0]*3 for i in range(3)]

잘 작동합니다.


답변

파이썬에서 2 차원 배열을 초기화하려면 :

a = [[0 for x in range(columns)] for y in range(rows)]


답변

[[foo for x in xrange(10)] for y in xrange(10)]


답변

일반적으로 다차원 배열을 원할 때 목록 목록이 아니라 numpy 배열 또는 dict이 필요합니다.

예를 들어, numpy를 사용하면 다음과 같은 작업을 수행합니다

import numpy
a = numpy.empty((10, 10))
a.fill(foo)