2017-02-16 15 views
2

Мой код выглядит следующим образом. Он петлится через капли, которые установлены в frozenset, и проверяет, пересекается ли каждый blob с отображением, которое является множеством. Если blob действительно пересекается с отображением, а также удовлетворяет условию терминальности, добавьте набор пересечений в результат.лучшая структура кода с for, if и set in python

result = set() 
for b in blobs:             
    mapped_b = b & mapped             
    if mapped_b and _is_terminal(mapped_b):       
     result.add(mapped_b) 

Может ли эта логика быть написана лучше? Я думал о понимании списка, но поскольку mapped_b сформирован на ходу, мне кажется, что я должен сделать это несколько раз, что является расточительным.

[result.add(b&mapped) for b in blobs if b&mapped and _is_terminal(b&mapped)] 

Также стоит проблема использовать filter для if заявления?

ответ

3

Насколько я знаю, существует no such thing as a let statement (например, в Haskell), что позволит временно сохранить результат mapped_b.

Вы можете использовать map или генератор для хранения промежуточного результата. Как:

result = {mapped_b for mapped_b in map(lambda b:b&mapped,blobs) if mapped_b and _is_terminal(mapped_b)}

Так map(lambda b:b&mapped,blobs) будет генерировать mapped_b элементы (в один за один раз, в с temprorary списка).

Или вы можете использовать генератор самостоятельно:

result = {mapped_b for mapped_b in (b&mapped for b in blobs) if mapped_b and _is_terminal(mapped_b)}

Обратите внимание, что мы здесь использовать набор понимания, не перечисляет понимания. В исходном фрагменте кода вы также создаете set.

EDIT:

на основе ваших комментариев, вы действительно можете опустить if часть с помощью filter как:

result = set(filter(lambda b: b and _is_terminal(b),(b&mapped for b in blobs))) 

Это семантически эквивалентны. Является ли одно предпочтительным по сравнению с другим, обычно является аспектом вкуса. Здесь они легко взаимозаменяемы.

+0

Что вы думаете о 'result = set (filter (lambda b: if b и _is_terminal (b), (b & отображается для b в blobs)))'? Это плохой код? – nos

+0

не по себе, но мой опыт в том, что * установленное понимание * обычно более эффективно (и более элегантно). Afaik 'filter' не ускорит процесс (много). Но он будет иметь семантически тот же результат. –

+0

@nos: обратите внимание, что вы должны сбросить 'if' в' lambda' 'filter'. –