2014-11-18 2 views
2

저는 Clojure에서 Python을 사용하려고합니다. 생성기 내부에 "임시 변수"를 갖는 방법이 있는지 궁금합니다. , I는 None 결과를 필터링 회 발생기를 사용할 필요 파이썬파이썬 생성기를위한`let` 또는`as` 키워드가 있습니까?

(def fnames ["abc1234" "abcdef" "1024"]) 
(for [fname fnames 
     :let [matches (re-matches #"(\w+?)(\d+)" fname)] 
     :when matches] 
    matches) 
;=> (["abc10" "abc" "1234"] ["1024" "1" "024"]) 

:

는 Clojure에에서, I는 상품에 중간 계산 이름을 생성하기위한 내부 let 사용할 수

fnames = ["abc1234", "abcdef", "1024"] 
matches = [re.match('(\w+?)(\d+)', fname) for fname in fnames] 
matches = [match.groups() for match in matches if match is not None] 
# [('abc', '1234'), ('1', '024')] 

그래서 다음과 같은 방법이 있습니까? 그렇지 않다면 가장 Pythonic 한 방법은 무엇입니까?

matches = [re.match('(\w+?)(\d+)', fname) as match 
    for fname in fnames 
    if match is not None] 

답변

5

아니요, Clojure의 let과 직접적인 동일은 없습니다. 파이썬의리스트 통합의 기본 구조는 다음 if condition 부분은 선택 사항입니다

[name for name in iterable if condition] 

. 그것이 grammar이 제공하는 전부입니다.

matches = [m.groups() for m in (re.match('(\w+?)(\d+)', f) for f in fnames) if m] 

데모 : : 또한

>>> import re 
>>> fnames = ["abc1234", "abcdef", "1024"] 
>>> matches = [m.groups() for m in (re.match('(\w+?)(\d+)', f) for f in fnames) if m] 
>>> matches 
[('abc', '1234'), ('1', '024')] 
>>> 

, 당신은 내가 is not None 부분을 제거 것을 알 수

그러나 특정 경우

, 당신은 지능형리스트 안에 generator expression를 둘 수 있었다 너의 상태. 일반적으로 None을 명시 적으로 테스트하는 것이 좋지만 re.match은 항상 일치 객체 (truey 값) 또는 None (false 값)을 반환하므로이 경우에는 필요하지 않습니다.

+0

그래서 더 일반적인 접근법은 발전기를 중첩하는 것입니까? 필자가 filter/map/reduce보다 더 읽기 쉬울 지 모르겠습니다. –

+0

@BrunoKim - 예. 사실, generator/expression/list comprehensions은 대부분의 Python 프로그래머가 filter/map/reduce 솔루션을 사용하는 것을 선호합니다. 나열된 기능을 향후 버전의 언어에서 제거하는 방법조차 있습니다. 즉, 당신은 여전히 ​​당신의 이해력의 길이를 봐야한다고 말했다. 한 줄로 모든 것을 다 처리해야하는 것은 아닙니다. :) – iCodez

관련 문제