N 번 반복 된 단일 항목 목록 만들기


523

다양한 길이의 일련의 목록을 만들고 싶습니다. 각 목록에는 동일한 요소 e가 반복 n횟수로 포함됩니다 (여기서 n= 목록의 길이).

[e for number in xrange(n)]각 목록에 대해 목록 이해 를 사용하지 않고 목록을 작성하려면 어떻게합니까 ?

답변:


778

당신은 또한 쓸 수 있습니다 :

[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.


23
동일한 요소로 목록을 만드는 성능이 파이썬 프로그램 성능의 중요한 구성 요소가 될 가능성은 거의 없습니다.
Arthur

11
위에서 언급했듯이 e가 빈 목록이면 [[]] * n예기치 않은 결과가 발생할 수 있습니다. 고유 한 빈 하위 목록 을 만들려면 다음을 이해하십시오.[[] for i in range(0,n)]
Josiah Yoder

149
>>> [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]]

80

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'])]

26

Itertools에는 다음과 같은 기능이 있습니다.

import itertools
it = itertools.repeat(e,n)

물론 itertools목록 대신 반복자를 제공합니다. [e] * n목록을 제공하지만 해당 시퀀스로 수행 할 작업에 따라 itertools변형이 훨씬 더 효율적일 수 있습니다.


13

다른 사람들이 지적했듯이 변경 가능한 객체에 * 연산자를 사용하면 참조가 복제되므로 하나를 변경하면 모두 변경됩니다. 가변 객체의 독립적 인 인스턴스를 만들려면 xrange 구문이 가장 파이썬적인 방법입니다. 결코 사용되지 않는 명명 된 변수를 사용하여 신경이 쓰이는 경우 익명 밑줄 변수를 사용할 수 있습니다.

[e for _ in xrange(n)]

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.