基于多个条件从python中的列表中删除元素

时间:2016-03-14 18:45:40

标签: python list

我有这个人。 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']

我想删除包含5个中的任何一个的元素。要素:c3ann c4ann c3per c4per c3nfx

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

如何改进上述方法?

3 个答案:

答案 0 :(得分:5)

all()会有所帮助:

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

或者,正如@HaiVu正确指出的那样,将逻辑更改为适合any()会加快速度:

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

答案 1 :(得分:0)

您可以使用正则表达式:

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

答案 2 :(得分:0)

我不知道你想改进什么..速度,易读性等。

也许你想要这样的东西:

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