2016-07-11 1 views
0

Так что я ищу правильный способ поиска списка и фильтрации элементов на основе нескольких других списков.Нужна помощь по перечислениям списка. Как использовать несколько исключений

imageList = ['green_D.jpg', 'red_D.gif', 'orange_R.jpg', 'black_S.gif', 'folder_A', 'folder_B'] 
included_extensions = ['jpg', 'bmp', 'png', 'gif'] 
excluded_textures = ['_R.', '_A.', '_S.'] 

Я хочу, чтобы затем перебрать мой Imagelist и фильтровать только изображения с помощью incuded_extensions, а затем отфильтровать все текстуры аббревиатуры, указанные в excluded_textures.

Мой код не удалось:

newImageList = [ (img for img in imageList) if (tex for tex in excluded_textures) not in img and any(img.endswith(ext) in img for ext in included_extensions)] 

Результат должен содержать только тогда

newImageList = ['green_D.jpg', 'red_D.gif'] 
+4

'[i для i в imageList, если есть (ext in i для ext в комплекте), а не какой-либо (ext in i для ext in excluded)]'? – Bakuriu

+5

Вам было бы лучше начать с написания этого как стандартных вложенных циклов, а затем * попытаться составить понимание списка из этого (если вы все еще чувствуете, что вам нужно). – jonrsharpe

+0

Кстати, просто потому, что что-то * может быть записано как понимание списка, не означает, что оно должно быть написано как понимание списка. Показатели удобочитаемости! – DeepSpace

ответ

2

В этом случае я бы использовать цикл - Зубрежка все это в единый список-понимания является чтобы сделать код сложнее понять, что на самом деле не так, как вы хотите ...:

imageList = ['green_D.jpg', 'red_D.gif', 'orange_R.jpg', 'black_S.gif', 'folder_A', 'folder_B'] 
included_extensions = ('jpg', 'bmp', 'png', 'gif') # Note, tuple. 
excluded_textures = ('_R.', '_A.', '_S.') 

newImageList = [] 
for img in imageList: 
    # If the extension isn't included, just continue the loop. 
    if not img.endswith(included_extensions): # str.endswith accepts tuple, but not list (see change above). 
     continue 

    # Split off the extension so we can test the excluded_textures 
    base, _ = os.path.splitext(img) 
    # If the image's base ends with an excluded texture, just continue the loop. 
    if (base + '.').endswith(excluded_textures): 
     continue 

    # The image has passed all of the validation we threw at it. Add 
    # it to the newImageList. 
    newImageList.append(img) 

Я только что протестировал его d этот код дает правильный вывод.

+0

Можете ли вы объяснить, почему вы изменили __included_extensions__ из 'list' в' tuple'? Это связано со скоростью? –

+0

Upvote для чистого кода .. Не могли бы вы объяснить, как работает последнее утверждение if? –

+1

@ Ev.Kounis - 'str.startswith' и' str.endswith' принимают 'tuple' (но не' list'). – mgilson

1
imageList = ['green_D.jpg', 'red_D.gif', 'orange_R.jpg', 'black_S.gif', 'folder_A', 'folder_B'] 
included_extensions = ['jpg', 'bmp', 'png', 'gif'] 
excluded_textures = ['_R.', '_A.', '_S.'] 

print filter(lambda x:x[-3:] in included_extensions and x[-6:-3] not in excluded_textures,imageList) 
0
In [16]: new_list = [img for img in imageList if any(img.endswith(good_ext) for 
    ...: good_ext in included_extensions) and not any(bad_tex in img for bad_tex 
    ...: in excluded_textures)] 

In [17]: new_list 
Out[17]: ['green_D.jpg', 'red_D.gif'] 

Если вы действительно хотите сделать это с помощью списка понимания вот как. (Не очень читаемо)

+0

FWIW, 'any (img.endswith (good_ext) для good_ext в include_extensions)' может быть записано как 'img.endswith (tuple (included_extensions))' и если 'included_extensions' является' tuple', чтобы быть с ним, то это определенно проще написать. – mgilson

+0

Большое вам спасибо! Снова переполнение стека приходит на помощь! – NaughtyDag