Манипулировать выводом цикла for, если он есть - PullRequest
0 голосов
/ 09 ноября 2018

Мне нужно сравнить следующие sequences элементы списка:

sequences = ['sphere_v002_', 'sphere_v002_0240_', 'test_single_abc_f401']

до:

folder = 'sphere_v002'

, а затем работайте с элементами списка, содержащими folder.

У меня есть рабочая функция для этого, но я хочу улучшить ее.

Текущий код:

foundSeq = False

for seq in sequences:
    headName = os.path.splitext(seq.head())[0]

    #Check name added exception for when name has a last underscore                 
    if headName == folder or headName[:-1] == folder:
        foundSeq = True
        sequence = seq

if not foundSeq:
    ...

Мое улучшение выглядит так:

if any(folder in os.path.splitext(seq.head())[0] for seq in sequences):
    print seq

Но тогда я получаю следующую ошибку:

local variable seq referenced before the assignment

Как получить правильный вывод при работе с улучшенным решением?

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Как указывает jpp, any просто возвращает логическое значение. Так что, если таковые имеются, не является хорошим решением в данном конкретном случае.

Как предлагает thebjorn, наиболее эффективный код для нас на данный момент состоит в использовании функции filter.

sequences = ['sphere_v002_', 'sphere_v002_0240_', 'test_single_abc_f401']
match = filter(lambda x: 'sphere_v002' == x[:-1] or 'sphere_v002' == x, sequences)
print match
['sphere_v002_']
0 голосов
/ 09 ноября 2018

any возвращает только логическое значение, оно не будет хранить в переменной seq элемент в sequences, когда ваше условие выполнено.

То, что вы можете сделать, это использовать генератор и использовать тот факт, что None - это "Ложь":

def get_seq(sequences, folder):
    for seq in sequences:
        if folder in os.path.splitext(seq.head())[0]:
            yield seq

for seq in get_seq(sequences, folder):
    print seq

Вы можете переписать это, если хотите, как выражение генератора:

for seq in (i for i in sequences if folder in os.path.splitext(i.head())[0]):
    print seq

Если условие никогда не указывается, генератор или выражение генератора не будут давать никаких значений, и логика в вашем цикле не будет обработана.

...