I have a list of tuples that is created with the zip
function. zip
is bringing together four lists: narrative
, subject
, activity
, and filer
, each of which is just a list of 0s and 1s. Let's say those four lists look like this:
narrative = [0, 0, 0, 0]
subject = [1, 1, 0, 1]
activity = [0, 0, 0, 1]
filer = [0, 1, 1, 0]
Now, I'm zip
ing them together to get a list of boolean values indicating if any of them are True
.
ny_nexus = [True if sum(x) > 0 else False for x in zip(narrative, subject, activity, filer)]
The problem I'm having now, is getting a second list of tuples for which the names of the variables is returned if it had a 1 during the iteration. I imagine it would look something like this:
variables = ("narrative", "subject", "activity", "filer")
reason = [", ".join([some code to filter a tuple]) for x in zip(narrative, subject, activity, filer)]
I just can't figure out how I'd go about this. My desired output would look like this:
reason
# ["subject", "subject, filer", "filer", "subject, activity"]
I'm somewhat new to Python, so I apologize if the solution is easy.
Store tuples in a dictionary for a cleaner solution:
tups = {'narrative': narrative,
'subject': subject,
'activity': activity,
'filer': filer}
The solution:
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())]
Solutions above do not preserve the order of tuples, e.g. they can return something like
['subject', 'filer, subject', 'filer', 'activity, subject']
If you need the order to be preserved, use collections.OrderedDict
as shown below:
from collections import OrderedDict
tups = OrderedDict([
('narrative', narrative),
('subject', subject),
('activity', activity),
('filer', filer)
])
# The result is ['subject', 'subject, filer', 'filer', 'subject, activity']
EDIT: The solution that doesn't involve dictionaries:
from itertools import compress
reason = [', '.join(compress(variables, x))
for x in zip(narrative, subject, activity, filer)]
Consider using dictionaries if the zip(...)
call no longer fits on one line.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With