42
목록 이해를 사용하여 목록에서 2 튜플의 튜플을 빌드하는 방법은 무엇입니까? 그것은이 generator expression의,목록 이해법을 사용하여 튜플 구성
tup =()
for element in alist:
tup = tup + ((element.foo, element.bar),)
목록 이해를 사용하여 목록에서 2 튜플의 튜플을 빌드하는 방법은 무엇입니까? 그것은이 generator expression의,목록 이해법을 사용하여 튜플 구성
tup =()
for element in alist:
tup = tup + ((element.foo, element.bar),)
tup = tuple((element.foo, element.bar) for element in alist)
기술적으로 동등하다. 그것은 목록 이해력과 같지만 느리게 평가되고 중간 목록에 메모리를 할당 할 필요가 없습니다.
완성도를 들어, 지능형리스트는 다음과 같이 보일 것이다 :
tup = tuple([(element.foo, element.bar) for element in alist])
이
PS : attrgetter
하지 빠르다 (alist
여기 만 항목이) :
In [37]: %timeit tuple([(element.foo, element.bar) for element in alist])
1 loops, best of 3: 165 ms per loop
In [38]: %timeit tuple((element.foo, element.bar) for element in alist)
10 loops, best of 3: 155 ms per loop
In [39]: %timeit tuple(map(operator.attrgetter('foo','bar'), alist))
1 loops, best of 3: 283 ms per loop
In [40]: getter = operator.attrgetter('foo','bar')
In [41]: %timeit tuple(map(getter, alist))
1 loops, best of 3: 284 ms per loop
In [46]: %timeit tuple(imap(getter, alist))
1 loops, best of 3: 264 ms per loop
(+ 1) 기술적으로 지적할만한 가치가있을 수도 있지만, 이것은 목록의 이해력이 아닙니다 (그러나 OP가 마음에 들지 않을 것이라고 확신합니다 :)) – NPE
you coul d 또한'tuple (map (operator.attrgetter ('foo', 'bar'), alist))'를 실행합니다. 난 당신이 가독성을 위해 게시 한 것을 사용 하겠지만, "attrgetter"는 약간의 성능 이점을 가질 수 있습니다. 당신은'timeit'을해야만하고 이것이 정말로 어려운 루프에 있는지 알아야합니다. – mgilson
이 예제에서 tuple()이 호출되었으므로 목록 이해력과 생성자 표현식의 차이점은 무엇입니까? 양식에 관계없이 동일한 메모리 사용 공간을 소모하지 않습니까? – Octipi