user308827
user308827

Reputation: 21961

Remove elements from list in python based on multiple conditions

I have the foll. list in python:

list_vals = ['primf_to_primf', 'primf_to_primn', 'primf_to_secdf', 'primf_to_secdn', 'primf_to_urban', 'primf_to_c3ann', 'primf_to_c4ann', 'primf_to_c3per', 'primf_to_c4per', 'primf_to_c3nfx', 'primf_to_pastr', 'primf_to_range', 'primn_to_primf', 'primn_to_primn', 'primn_to_secdf', 'primn_to_secdn', 'primn_to_urban', 'primn_to_c3ann', 'primn_to_c4ann', 'primn_to_c3per', 'primn_to_c4per', 'primn_to_c3nfx', 'primn_to_pastr', 'primn_to_range', 'secdf_to_primf', 'secdf_to_primn', 'secdf_to_secdf', 'secdf_to_secdn', 'secdf_to_urban', 'secdf_to_c3ann', 'secdf_to_c4ann', 'secdf_to_c3per', 'secdf_to_c4per', 'secdf_to_c3nfx', 'secdf_to_pastr', 'secdf_to_range', 'secdn_to_primf', 'secdn_to_primn', 'secdn_to_secdf', 'secdn_to_secdn', 'secdn_to_urban', 'secdn_to_c3ann', 'secdn_to_c4ann', 'secdn_to_c3per', 'secdn_to_c4per', 'secdn_to_c3nfx', 'secdn_to_pastr', 'secdn_to_range', 'urban_to_primf', 'urban_to_primn', 'urban_to_secdf', 'urban_to_secdn', 'urban_to_urban', 'urban_to_c3ann', 'urban_to_c4ann', 'urban_to_c3per', 'urban_to_c4per', 'urban_to_c3nfx', 'urban_to_pastr', 'urban_to_range', 'c3ann_to_primf', 'c3ann_to_primn', 'c3ann_to_secdf', 'c3ann_to_secdn', 'c3ann_to_urban', 'c3ann_to_c3ann', 'c3ann_to_c4ann', 'c3ann_to_c3per', 'c3ann_to_c4per', 'c3ann_to_c3nfx', 'c3ann_to_pastr', 'c3ann_to_range', 'c4ann_to_primf', 'c4ann_to_primn', 'c4ann_to_secdf', 'c4ann_to_secdn', 'c4ann_to_urban', 'c4ann_to_c3ann', 'c4ann_to_c4ann', 'c4ann_to_c3per', 'c4ann_to_c4per', 'c4ann_to_c3nfx', 'c4ann_to_pastr', 'c4ann_to_range', 'c3per_to_primf', 'c3per_to_primn', 'c3per_to_secdf', 'c3per_to_secdn', 'c3per_to_urban', 'c3per_to_c3ann', 'c3per_to_c4ann', 'c3per_to_c3per', 'c3per_to_c4per', 'c3per_to_c3nfx', 'c3per_to_pastr', 'c3per_to_range', 'c4per_to_primf', 'c4per_to_primn', 'c4per_to_secdf', 'c4per_to_secdn', 'c4per_to_urban', 'c4per_to_c3ann', 'c4per_to_c4ann', 'c4per_to_c3per', 'c4per_to_c4per', 'c4per_to_c3nfx', 'c4per_to_pastr', 'c4per_to_range', 'c3nfx_to_primf', 'c3nfx_to_primn', 'c3nfx_to_secdf', 'c3nfx_to_secdn', 'c3nfx_to_urban', 'c3nfx_to_c3ann', 'c3nfx_to_c4ann', 'c3nfx_to_c3per', 'c3nfx_to_c4per', 'c3nfx_to_c3nfx', 'c3nfx_to_pastr', 'c3nfx_to_range', 'pastr_to_primf', 'pastr_to_primn', 'pastr_to_secdf', 'pastr_to_secdn', 'pastr_to_urban', 'pastr_to_c3ann', 'pastr_to_c4ann', 'pastr_to_c3per', 'pastr_to_c4per', 'pastr_to_c3nfx', 'pastr_to_pastr', 'pastr_to_range', 'range_to_primf', 'range_to_primn', 'range_to_secdf', 'range_to_secdn', 'range_to_urban', 'range_to_c3ann', 'range_to_c4ann', 'range_to_c3per', 'range_to_c4per', 'range_to_c3nfx', 'range_to_pastr', 'range_to_range']

I would like to delete elements which have any of 5 of the foll. elements: c3ann c4ann c3per c4per c3nfx

y = [s for s in x if 'c3ann' not in list_vals]

How do I improve the approach above?

Upvotes: 0

Views: 672

Answers (3)

cromerou
cromerou

Reputation: 62

I dont know what you want to improve .. speed, legibility, etc.

Maybe you want something like that:

res = filter(lambda word: 'c3ann' not in word, list_vals)

Upvotes: 0

alecxe
alecxe

Reputation: 473853

all() would help:

words = ["c3ann", "c4ann", "c3per", "c4per", "c3nfx"]   
y = [s for s in list_vals if all(word not in s for word in words)]

Or, as @HaiVu correctly noted, changing the logic to fit any() would speed things up:

y = [s for s in list_vals if not any(word in s for word in words)]

Upvotes: 6

tjohnson
tjohnson

Reputation: 1077

You could use a regular expression:

import re
y = [item for item in list_vals if not re.search(r'c\d(ann|per|nfx)', item)]

Upvotes: 0

Related Questions