나는 itertools.chain을 사용하여 다음과 같은 방식으로 목록 목록을 “평탄화”합니다.
uniqueCrossTabs = list(itertools.chain(*uniqueCrossTabs))
이것이 말하는 것과 다른 점 :
uniqueCrossTabs = list(itertools.chain(uniqueCrossTabs))
답변
*
는 “splat”연산자입니다. 목록을 입력으로 받아 함수 호출에서 실제 위치 인수로 확장합니다.
그렇다면 uniqueCrossTabs
이었다 [ [ 1, 2 ], [ 3, 4 ] ]
, 그 다음 itertools.chain(*uniqueCrossTabs)
말과 동일itertools.chain([ 1, 2 ], [ 3, 4 ])
이것은 그냥 전달하는 것과 분명히 다릅니다 uniqueCrossTabs
. 귀하의 경우에는 병합하려는 목록 목록이 있습니다. 어떤 itertools.chain()
일은 각 위치 인수가 그 자체로 반복 가능한 당신이 그것을 통과하는 모든 위치 인수의 연결의 반복자를 반환한다.
즉, 각 목록을에 uniqueCrossTabs
인수로 전달하여 chain()
함께 연결하고 싶지만 별도의 변수에 목록이 없으므로 다음을 사용합니다.*
연산자를 하여 목록 목록을 여러 목록 인수로 확장합니다.
Jochen Ritzel이 주석에서 지적했듯이이 chain.from_iterable()
작업에는이 작업에 더 적합합니다. 시작하는 이터 러블의 단일 이터 러블을 가정하기 때문입니다. 그러면 코드가 간단 해집니다.
uniqueCrossTabs = list(itertools.chain.from_iterable(uniqueCrossTabs))
답변
함수 호출을 위해 시퀀스를 별도의 인수로 분할합니다.
>>> def foo(a, b=None, c=None):
... print a, b, c
...
>>> foo([1, 2, 3])
[1, 2, 3] None None
>>> foo(*[1, 2, 3])
1 2 3
>>> def bar(*a):
... print a
...
>>> bar([1, 2, 3])
([1, 2, 3],)
>>> bar(*[1, 2, 3])
(1, 2, 3)
답변
개념을 설명 / 사용하는 다른 방법 일뿐입니다.
import random
def arbitrary():
return [x for x in range(1, random.randint(3,10))]
a, b, *rest = arbitrary()
# a = 1
# b = 2
# rest = [3,4,5]