完整的示例代码:
for typeA in typeAlist:
if typeA in [typeB.typeA for typeB in typeBlist]:
return typeB
显然这不起作用,但感觉会有一种巧妙的方法来检索与typeA对象匹配的typeB对象。
我能想到使其工作的唯一方法是使用嵌套for循环,迭代typeBlist直到typeA属性匹配,然后断开。有更干净的方式吗?或者这实际上是否足够干净?
答案 0 :(得分:3)
您可以在列表理解中使用if
:
[typeB for typeB in typeBlist if typeB.typeA == typeA]
这会返回typeBlist
的所有typeB.typeA == typeA
成员。
如果您确定只有一个匹配项,则可以使用生成器表达式停止处理整个列表:
try:
return (typeB for typeB in typeBlist if typeB.typeA == typeA).next()
except StopIteration:
return None
如果您正在进行大量查询,则可能更容易创建dict
以从typeA
映射到typeB
。
lookup = dict((typeB.typeA,typeB) for typeB in typeBlist)
然后您可以像这样重复使用:
typeB = lookup[typeA]
如果每个typeB
可能有多个typeA
个条目,那么您的查询会将typeA
映射到list
个typeB
:
from collections import defaultdict
lookup = defaultdict(list)
for typeB in typeBlist:
lookup[typeB.typeA].append(typeB)
答案 1 :(得分:1)
怎么样:
matching_typeBs = [ x for x in typeBlist if x.typeA in typeAlist ]
答案 2 :(得分:0)
或与filter语句完全相同(请注意,您可以自行选择是使用过滤器还是列表理解,但第二个通常更快):
filter(lambda x: x.typeA in typeAlist, typeBlist)