나는 파이썬을 시작하고 있으며 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]*10
10 회 반복 된 동일한 객체의 목록을 만듭니다. 하나의 요소를 수정하면 각 행에서 동일한 요소가 수정되므로 이것을 사용할 수 없습니다!
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)