if typeA в [typeB.typeA для typeB в typeBlist]: ... доступ к typeB в предложении if? - PullRequest
0 голосов
/ 04 августа 2011

Полный пример кода:

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

Очевидно, что это не работает, но кажется, что был бы отличный способ получить объект typeB, который соответствует объекту typeA.* Единственный способ заставить его работать, это иметь вложенный цикл for, перебирать typeBlist до совпадения атрибута typeA, а затем прерывать.Есть ли более чистый способ?Или это на самом деле достаточно чисто?

Ответы [ 3 ]

3 голосов
/ 04 августа 2011

Вы можете использовать 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 s:

from collections import defaultdict
lookup = defaultdict(list)
for typeB in typeBlist:
    lookup[typeB.typeA].append(typeB)
1 голос
/ 04 августа 2011

Как насчет:

matching_typeBs = [ x for x in typeBlist if x.typeA in typeAlist ]
0 голосов
/ 04 августа 2011

Или то же самое с оператором фильтра (обратите внимание, что вы сами можете выбрать, использовать ли фильтр или список, но второй обычно быстрее):

filter(lambda x: x.typeA in typeAlist, typeBlist)
...