Sie können auch Filter() statt der Liste Verständnis, was den Vorteil haben, dass Sie leicht Ihre Filterfunktion für mehr Flexibilität tauschen:
>>> l1 = ['test1', 'test2', 'test3', 'test4', 'test5']
>>> l2 = set(['*t1*', '*t4*'])
>>> filterfunc = lambda item: not any(fnmatch(item, pattern) for pattern in l2)
>>> filter(filterfunc, l1)
Out: ['test2', 'test3', 'test5']
>>> # now we don't like our filter function no more, we assume that our l2 set should match on any partial match so we can get rid of the star signs:
>>> l2 = set(['t1', 't4'])
>>> filterfunc = lambda item: not any(pattern in item for pattern in l2)
>>> filter(filterfunc, l1)
Out: ['test2', 'test3', 'test5']
Auf diese Weise können Sie sogar verallgemeinern Ihre filterfunc mit mehreren Mustern arbeiten setzt:
>>> from functools import partial
>>> def filterfunc(item, patterns):
return not any(pattern in item for pattern in patterns)
>>> filter(partial(filterfunc, patterns=l2), l1)
Out: ['test2', 'test3', 'test5']
>>> filter(partial(filterfunc, patterns={'t1','test5'}), l1)
Out: ['test2', 'test3', 'test4']
Und natürlich könnte man leicht aktualisieren Sie Ihre filterfunc reguläre Ausdrücke in dem Mustersatz zu akzeptieren, zum Beispiel.
Gute Eins! Ich kannte einen Ansatz, der eine 'list'-Unterklasse verwendete, die reguläre Ausdrücke akzeptierte. Wusste das nicht. –