Поиск элементов в кортеже и их фильтрация

Предполагая, что у меня есть кортеж:

[('text-1','xxx'), ('img-1','iii'), ('img-2','jjj'), ('text-2','xxx')] 

Я хочу отфильтровать список и создать новый с элементами, начинающимися с «img». Итак, мой новый список будет выглядеть так:

 [('img-1','iii'), ('img-2','jjj')] 

Благодаря!

В одну сторону:

 >>> l = [('text-1','xxx'), ('img-1','iii'), ('img-2','jjj'), ('text-2','xxx')] >>> [t for t in l if t[0].startswith('img')] [('img-1', 'iii'), ('img-2', 'jjj')] 

Другой путь:

 >>> filter(lambda x: x[0].startswith('img'), l) [('img-1', 'iii'), ('img-2', 'jjj')] 

Первое называется пониманием списка. См . Ответ FC для соответствующего метода. Основной синтаксис – это [{expression} for {item_var_or_vars} in {iterable} if {boolean_expression}] . Это семантически эквивалентно примерно так:

 new_list = [] for {item_var_or_vars} in {iterable}: if {boolean_expression}: new_list.append({expression}) 

if {boolean_expression} является необязательным, как и в цикле for.

Второй – это просто встроенный функциональный filter , который принимает тестовую функцию и итерацию и возвращает список, содержащий каждый элемент, который «передает» тестовую функцию. lambda , если вы еще этого не видели, это просто быстрый способ определения функции. Вы могли бы сделать это вместо этого:

 def keep_this_element(element): return element[0].startswith('img') # returns True for ('img...', '...') new_list = filter(keep_this_element, l) # keeps only elements that return True 

Что-то вроде этого возможно?

 l2 = [item for item in l1 if item[0].startswith('img')] 

Еще один способ с выражением генератора (это может иметь значение для больших списков)

 >>> l = [('text-1','xxx'), ('img-1','iii'), ('img-2','jjj'), ('text-2','xxx')] >>> (x for x in l if x[0].find('img') == 0) 0: <generator object <genexpr> at 0x917a00> >>> gen = (x for x in l if x[0].find('img') == 0) >>> list(gen) 1: [('img-1', 'iii'), ('img-2', 'jjj')] 
 tuple_filter = lambda t, i, w: filter(lambda a: a[i].startswith(w), t) newtuple = tuple_filter(thetuple, 0, 'img')