2011-10-11 107 views
1

给出一个项目列表,以及从谓词函数到“值”函数的映射,以下代码将“值”函数应用于满足相应谓词的项目: 有没有办法让这段代码更简洁?

 
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) 
对于上面的代码可以做类似的事情吗?我知道,也许最好留下这些嵌套循环,但我只是好奇它是否可能。

+0

它总是会是'lambda x:x'吗?似乎有点毫无意义。 –

+0

当然不是。这只是一个例子:) – akonsu

回答

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 
+0

这是一个很好的。这些懒惰的迭代器可以让你更接近编程的功能风格。 – akonsu

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

你说的比较简洁吧? ; ^)

+0

只是一个单词。哇。 – akonsu

+0

不好,嗯? – Nate

+0

等待,但是当找到谓词时my_map上的循环终止了吗? – akonsu

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迭代,但只要第一个成功的映射是停止找到。

相关问题