Bru*_*Kim 2 python syntax clojure generator
我是从Clojure来到Python的,并且想知道是否有办法在生成器中有一个"临时变量".
在Clojure中,我可以使用let
内部的for生成器来命名项目的中间计算:
(def fnames ["abc1234" "abcdef" "1024"])
(for [fname fnames
:let [matches (re-matches #"(\w+?)(\d+)" fname)]
:when matches]
matches)
;=> (["abc10" "abc" "1234"] ["1024" "1" "024"])
Run Code Online (Sandbox Code Playgroud)
在Python中,我需要使用两次生成器来过滤掉None
结果:
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')]
Run Code Online (Sandbox Code Playgroud)
那么,有没有办法做以下事情?如果没有,最恐怖的方式是什么?
matches = [re.match('(\w+?)(\d+)', fname) as match
for fname in fnames
if match is not None]
Run Code Online (Sandbox Code Playgroud)
不,没有直接相当于Clojure的let
.Python列表理解的基本结构是:
[name for name in iterable if condition]
Run Code Online (Sandbox Code Playgroud)
其中if condition
部分是可选的.这就是语法提供的全部内容.
在您的特定情况下,您可以在列表解析中放置一个生成器表达式:
matches = [m.groups() for m in (re.match('(\w+?)(\d+)', f) for f in fnames) if m]
Run Code Online (Sandbox Code Playgroud)
演示:
>>> 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')]
>>>
Run Code Online (Sandbox Code Playgroud)
此外,您会注意到我删除了is not None
您的部分条件.虽然显式测试通常是一个好主意None
,但在这种情况下不需要它,因为re.match
总是返回匹配对象(真值)或None
(假值).
归档时间: |
|
查看次数: |
151 次 |
最近记录: |