Store tuples in a dictionary for a cleaner solution:
tups = {'narrative': narrative, 'subject': subject, 'activity': activity, 'filer': filer}
Decision:
reason = [', '.join(k for k, b in zip(tups, x) if b) for x in zip(*tups.values())]
It can also be written using itertools.compress :
from itertools import compress reason = [', '.join(compress(tups, x)) for x in zip(*tups.values())]
The solutions mentioned above do not preserve the order of tuples, for example. they can return something like
['subject', 'filer, subject', 'filer', 'activity, subject']
If you need to save the order, use collections.OrderedDict , as shown below:
from collections import OrderedDict tups = OrderedDict([ ('narrative', narrative), ('subject', subject), ('activity', activity), ('filer', filer) ])
EDIT: A solution that does not include dictionaries:
from itertools import compress reason = [', '.join(compress(variables, x)) for x in zip(narrative, subject, activity, filer)]
Consider using dictionaries if calling zip(...) no longer suitable for a single line.