首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python生成器有‘for’或‘Is’关键字吗?

Python生成器有‘for’或‘Is’关键字吗?
EN

Stack Overflow用户
提问于 2014-11-18 02:39:01
回答 1查看 219关注 0票数 2

我将从Clojure学习Python,并想知道在生成器中是否有一种“临时变量”。

在Clojure中,我可以使用for生成器中的let来命名项上的中间计算:

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

在Python中,我需要使用生成器两次过滤出None结果:

代码语言:javascript
复制
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')]

那么,有什么方法可以这样做吗?如果不是,什么是最毕达通的方式?

代码语言:javascript
复制
matches = [re.match('(\w+?)(\d+)', fname) as match 
   for fname in fnames
   if match is not None]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-18 02:44:01

不,不存在与Clojure的let直接等效的方法。Python列表理解的基本结构是:

代码语言:javascript
复制
[name for name in iterable if condition]

其中if condition部件是可选的。这就是语法所提供的全部内容。

但是,在您的具体情况下,您可以在列表理解中添加一个生成器表达式

代码语言:javascript
复制
matches = [m.groups() for m in (re.match('(\w+?)(\d+)', f) for f in fnames) if m]

演示:

代码语言:javascript
复制
>>> 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部分。虽然显式测试None通常是个好主意,但在这种情况下不需要它,因为re.match总是返回一个匹配对象(一个真实值)或None (一个falsey值)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26985674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档