N 번 반복 된 단일 항목 목록 만들기
나는 목록 이해가 이것을 할 것이라는 것을 알고 있지만, 더 짧은 (그리고 더 파이썬적인) 접근 방식이 있는지 궁금합니다.
다양한 길이의 일련의 목록을 만들고 싶습니다. 각 목록에는 동일한 요소 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 번 반복 된 단일 항목 목록 만들기
불변 아이템
없음, 문자열, 튜플 또는 고정 세트와 같은 변경 불가능한 항목의 경우 다음과 같이 수행 할 수 있습니다.
[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
작동해야합니다
참고 URL : https://stackoverflow.com/questions/3459098/create-list-of-single-item-repeated-n-times
'development' 카테고리의 다른 글
파일의 특정 줄에 대한 커밋 로그를 검색 하시겠습니까? (0) | 2020.02.16 |
---|---|
Ruby에서 include와 require의 차이점은 무엇입니까? (0) | 2020.02.16 |
함수의 존재를 확인하기 위해 템플릿을 작성할 수 있습니까? (0) | 2020.02.16 |
.NET에서 콘솔 응용 프로그램의 종료 코드를 어떻게 지정합니까? (0) | 2020.02.16 |
Array.prototype.slice.call ()은 어떻게 작동합니까? (0) | 2020.02.16 |