결과가 하나만있을 경우 목록 이해의 대안
파이썬에서 이해력을 나열하는 데 익숙해지기 시작했지만 다소 부적절하게 사용하고 있습니다. 목록 이해력을 사용하지만 생성 된 목록에서 첫 번째 (유일한) 항목을 즉시 가져 오는 시나리오를 몇 번 보았습니다. 다음은 그 예입니다.
actor = [actor for actor in self.actors if actor.name==actorName][0]
(self.actors에는 개체 목록이 포함되어 있으며 actorName에있는 특정 (문자열) 이름을 가진 개체를 찾으려고합니다.)
찾고있는 매개 변수와 일치하는 목록에서 개체를 꺼내려고합니다. 이 방법이 비합리적입니까? 매달려있는 [0]은 나를 약간 불안하게 만듭니다.
next
대신 생성기 표현식을 사용할 수 있습니다 . 중간 목록이 생성되지 않고 일치 항목이 발견되면 반복이 중지 될 수 있기 때문에 더 효율적입니다.
actor = next(actor for actor in self.actors if actor.name==actorName)
그리고 같은 senderle 점 밖으로,이 방법의 또 다른 장점은 일치하는 항목이없는 경우 기본을 지정할 수 있다는 것입니다 :
actor = next((actor for actor in self.actors if actor.name==actorName), None)
잠재적으로 많은 사람의 첫 번째 경기를하고 싶다면 next(...)
좋습니다. 그러나 정확히 하나를 기대한다면 방어 적으로 작성하는 것이 좋습니다.
[actor] = [actor for actor in self.actors if actor.name==actorName]
이것은 항상 끝까지 스캔하지만,와 달리 0 또는 둘 이상의 일치 항목이있는 경우 [0]
으로 분해 [actor]
하면 ValueError가 발생합니다. 아마도 버그를 잡는 것보다 훨씬 더 중요 할 것입니다. 이것은 당신의 가정을 독자에게 전달합니다.
0 일치에 대한 기본값을 원하지만 여전히> 1 일치를 포착하는 경우 :
[actor] = [actor for actor in self.actors if actor.name==actorName] or [default]
추신 오른쪽에 생성기 표현식을 사용할 수도 있습니다.
[actor] = (actor for actor in self.actors if actor.name==actorName)
조금 더 효율적이어야합니다. 왼쪽에 튜플 구문을 사용할 수도 있습니다.보다 대칭 적으로 보이지만 쉼표는보기 흉하고 너무 쉽게 IMHO를 놓칠 수 없습니다.
(actor,) = (actor for actor in self.actors if actor.name==actorName)
actor, = (actor for actor in self.actors if actor.name==actorName)
(어쨌든 왼쪽의 목록 대 튜플 구문은 순전히 외관상 동작에 영향을 미치지 않습니다)
이 게시물 에는 find()
꽤 잘 작동 하는 사용자 정의 함수가 있으며, 거기에있는 댓글 작성자도 generators를 기반으로이 방법에 연결했습니다 . 기본적으로이를 수행 할 수있는 좋은 방법은 하나도없는 것처럼 들리지만 이러한 솔루션은 나쁘지 않습니다.
개인적으로 나는 적절한 루프에서 이것을 할 것입니다.
actor = None
for actor in self.actors:
if actor.name == actorName:
break
꽤 길지만 일치하는 항목이 발견되는 즉시 반복을 중지한다는 장점이 있습니다.
'Nice programing' 카테고리의 다른 글
실행 취소 / 다시 실행 구현 (0) | 2020.11.27 |
---|---|
블러 이벤트를 수동으로 추적하지 않고 Backbone.js의 모델에 양식 입력을 바인딩 할 수 있습니까? (0) | 2020.11.27 |
서로 다른 데이터 프레임의 두 플롯을 결합하는 ggplot (0) | 2020.11.27 |
jQuery는 postmessage 이벤트를 지원하지 않습니까? (0) | 2020.11.27 |
양식에 저장되지 않은 변경 사항에 대한 경고 (0) | 2020.11.27 |