如果在TypeBlist中类型B的类型B.type中的typeA:...在if子句中访问typeB?

时间:2011-08-04 14:31:43

标签: python list attributes

完整的示例代码:

for typeA in typeAlist:
  if typeA in [typeB.typeA for typeB in typeBlist]:
    return typeB

显然这不起作用,但感觉会有一种巧妙的方法来检索与typeA对象匹配的typeB对象。

我能想到使其工作的唯一方法是使用嵌套for循环,迭代typeBlist直到typeA属性匹配,然后断开。有更干净的方式吗?或者这实际上是否足够干净?

3 个答案:

答案 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映射到listtypeB

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)