다양한 길이의 일련의 목록을 만들고 싶습니다. 각 목록에는 동일한 요소 e
가 반복 n
횟수로 포함됩니다 (여기서 n
= 목록의 길이).
[e for number in xrange(n)]
각 목록에 대해 목록 이해 를 사용하지 않고 목록을 작성하려면 어떻게합니까 ?
답변
당신은 또한 쓸 수 있습니다 :
[e] * n
e가 예를 들어 빈 목록 인 경우 n 개의 독립적 인 빈 목록이 아닌 동일한 목록에 대한 n 개의 참조가있는 목록을 얻게됩니다.
성능 시험
언뜻보기 에 반복은 n 개의 동일한 요소로 목록을 만드는 가장 빠른 방법 인 것 같습니다 .
>>> timeit.timeit('itertools.repeat(0, 10)', 'import itertools', number = 1000000)
0.37095273281943264
>>> timeit.timeit('[0] * 10', 'import itertools', number = 1000000)
0.5577236771712819
그러나 기다려라-그것은 공정한 시험이 아니다 …
>>> itertools.repeat(0, 10)
repeat(0, 10) # Not a list!!!
이 함수 itertools.repeat
는 실제로 목록을 만들지 않고 원하는 경우 목록을 만드는 데 사용할 수있는 객체를 만듭니다. 다시 시도하지만 목록으로 변환 해 보겠습니다.
>>> timeit.timeit('list(itertools.repeat(0, 10))', 'import itertools', number = 1000000)
1.7508119747063233
따라서 목록을 원하면을 사용하십시오 [e] * n
. 요소를 느리게 생성하려면을 사용하십시오 repeat
.
답변
>>> [5] * 4
[5, 5, 5, 5]
반복되는 항목이 목록 인 경우주의하십시오. 목록은 복제되지 않습니다. 모든 요소가 동일한 목록을 참조합니다!
>>> x=[5]
>>> y=[x] * 4
>>> y
[[5], [5], [5], [5]]
>>> y[0][0] = 6
>>> y
[[6], [6], [6], [6]]
답변
Python에서 n 번 반복 된 단일 항목 목록 만들기
불변 아이템
None, bool, int, float, string, tuples 또는 frozensets와 같은 불변 항목의 경우 다음과 같이 할 수 있습니다.
[e] * 4
메모리의 동일한 위치에서 동일한 항목을 가리 키므로 목록의 변경 불가능한 항목 (문자열, 튜플, 고정 집합 등)에만 사용하는 것이 가장 좋습니다. 모든 문자열의 스키마로 테이블을 작성해야 할 때 이것을 자주 사용하므로 중복성이 높은 일대일 매핑을 제공 할 필요가 없습니다.
schema = ['string'] * len(columns)
가변 품목
나는 오랫동안 파이썬을 사용해 왔으며 가변 인스턴스로 위의 작업을 수행하는 유스 케이스를 본 적이 없다. 대신 변경 가능한 빈 목록, 설정 또는 dict을 얻으려면 다음과 같이해야합니다.
list_of_lists = [[] for _ in columns]
밑줄은이 문맥에서 단순히 무시할 수있는 변수 이름입니다.
번호 만있는 경우 다음과 같습니다.
list_of_lists = [[] for _ in range(4)]
은 _
정말 특별하지 않다, 그러나 당신이 변수를 사용하여 다른 이름을 사용하지 않을 경우 코딩 환경 스타일 검사기는 아마 불평 할 것이다.
변경 가능한 항목과 함께 변경 불가능한 방법을 사용하기위한주의 사항 :
변경 가능한 객체를 사용 하여이 작업을 수행하십시오. 중 하나를 변경하면 모두 동일한 객체 이기 때문에 모두 변경됩니다 .
foo = [[]] * 4
foo[0].append('x')
foo는 이제 다음을 반환합니다.
[['x'], ['x'], ['x'], ['x']]
그러나 불변의 객체를 사용하면 객체가 아닌 참조를 변경하기 때문에 작동하게 할 수 있습니다.
>>> l = [0] * 4
>>> l[0] += 1
>>> l
[1, 0, 0, 0]
>>> l = [frozenset()] * 4
>>> l[0] |= set('abc')
>>> l
[frozenset(['a', 'c', 'b']), frozenset([]), frozenset([]), frozenset([])]
그러나 다시 변경 가능한 객체는 내부 작업이 참조가 아닌 객체를 변경하기 때문에 좋지 않습니다.
l = [set()] * 4
>>> l[0] |= set('abc')
>>> l
[set(['a', 'c', 'b']), set(['a', 'c', 'b']), set(['a', 'c', 'b']), set(['a', 'c', 'b'])]
답변
Itertools에는 다음과 같은 기능이 있습니다.
import itertools
it = itertools.repeat(e,n)
물론 itertools
목록 대신 반복자를 제공합니다. [e] * n
목록을 제공하지만 해당 시퀀스로 수행 할 작업에 따라 itertools
변형이 훨씬 더 효율적일 수 있습니다.
답변
다른 사람들이 지적했듯이 변경 가능한 객체에 * 연산자를 사용하면 참조가 복제되므로 하나를 변경하면 모두 변경됩니다. 가변 객체의 독립적 인 인스턴스를 만들려면 xrange 구문이 가장 파이썬적인 방법입니다. 결코 사용되지 않는 명명 된 변수를 사용하여 신경이 쓰이는 경우 익명 밑줄 변수를 사용할 수 있습니다.
[e for _ in xrange(n)]
답변
[e] * n
작동해야합니다