Use itemgetter .
from operator import itemgetter f = itemgetter(0) def func(i): if not i: return None r = f(i) if r: return str(r)
Using it:
>>> x = (('a',1), (2,3), (4,), None, '', False, [], (None,), ()) >>> filter(None, map(func, x)) ['a', '2', '4']
You can do this in a function:
def extract_first_non_none(collection): return filter(None, map(func, collection))
Or to the class:
class Extractor(): def __init__(self, index): self.getter = itemgetter(index) def _func(self, item): if not item: return None r = self.getter(item) if r != None: return str(r) def extract(self, collection): return filter(None, map(self._func, collection))
Class usage:
>>> x = (('a',1), (2,3), (4,), None, '', False, [], (None,), ()) >>> e = Extractor(0) >>> e.extract(x) ['a', '2', '4']