2015-05-29 3 views
2

У меня возникла ситуация, когда я использую понимание списка для сканирования одного списка и возврата элементов, соответствующих определенным критериям.Python: понимание списка с помощью вложенной петли

[item for item in some_list_of_objects if 'thisstring' in item.id]

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

string_list = ['somestring', 'another_string', 'etc']

[item for item in some_list_of_objects if one of string_list in item.id]

Что такое вещий способ сделать это? Я знаю, что могу легко переписать его, чтобы использовать стандартную структуру цикла, но я хотел бы сохранить понимание списка, если смогу это сделать, не создавая очень уродливый код.

Заранее спасибо.

+1

Честно говоря, я думаю, вам лучше всего использовать цикл. Вероятно, это станет самым чистым в долгосрочной перспективе. – mgilson

+0

Насколько велик ваш 'string_list'? –

+0

@StefanPochmann, вероятно, около 30. Я разбиваю ДНК-цепочку на кодоны, а затем выполняю перевод. –

ответ

2

Использование any:

string_list = ['somestring', 'another_string', 'etc'] 

[item for item in some_list if any(s in item.id for s in string_list)] 

любой будет лениво оценивать нарушения на первом матче или проверить все, если мы не получим совпадение.

+0

@AdamSmith, была моей первой мыслью, но OP хочет совместить также подстроки на основе их вопроса, если логика была item.id в string_list, тогда будет работать набор –

+0

@PadraicCunningham oh Я не заметил, что он выполнял подстроку. Я должен прочитать вопрос ближе! –

+0

Да, наверное, я должен был уточнить в моем вопросе. Я работаю с цепочками ДНК, и мне нужно сопоставить кодоны с аминокислотами через таблицу значений. –

2

Вы можете использовать встроенную функцию any для этого [item for item in some_list if any(s in item for s in string)]

Смежные вопросы