有没有办法让这段代码更简洁?

时间:2011-10-11 00:19:02

标签: python

给定项目列表,以及从谓词函数到“值”函数的映射,下面的代码将“值”函数应用于满足相应谓词的项:

my_re0 = re.compile(r'^([a-z]+)$')
my_re1 = re.compile(r'^([0-9]+)$')
my_map = [
    (my_re0.search, lambda x: x),
    (my_re1.search, lambda x: x),
    ]
for x in ['abc','123','a1']: for p, f in my_map: v = p(x) if v: print f(v.groups()) break
有没有办法用单一陈述表达相同的内容?

如果我不必将谓词返回的值传递给“value”函数,那么我就可以

for x in ['abc','123','a1']:
    print next((f(x) for p, f in my_map if p(x)), None)
可以为上面的代码做类似的事情吗?我知道,也许最好留下这些嵌套的for循环,但我只是好奇是否有可能。

3 个答案:

答案 0 :(得分:2)

比Nate的简洁一点; - )

from itertools import product

comb = product(my_map, ['abc','123','a1'])
mapped = ((p(x),f) for (p,f),x in comb)
groups = (f(v.groups()) for v,f in mapped if v)
print next(groups), list(groups) # first match and the rest of them

答案 1 :(得分:1)

[f(v.groups()) for x in ['abc','123','a1'] for p, f in my_map for v in [p(x)] if v]

你说的更简洁吧? ; ^)

答案 2 :(得分:0)

这是我的版本:

for x in ['abc','123','a1']:
    print next((f(v.groups()) for p, f in my_map for v in [p(x)] if v), None)
此版本不会遍历整个my_map,但会在找到第一个成功映射后立即停止。