Following snippet gives my intention of unzipping t1, t2, t3 or t1, t2 depending upon the task. I know such if-else on for statement doesn't exist but I am wondering is there a workaround for this. Any help or clarification questions are welcome.
def func(task, t1, t2, t3):
if task == 'abc': # t3=None for this case
for t1, t2 in zip(t1, t2):
// do something
else:
for t1, t2, t3 in zip(t1, t2, t3):
// do something
if task == 'abc':
t3 = None
func(task, t1, t2, t3)
Is there a way we can write a single for loop statement and then unzip the parameters inside of the for loop depending upon the task value. The problem is that when the third parameters is None, it throws the error: TypeError: zip argument #3 must support iteration when task==abc. I want to have a common of do something`.
CodePudding user response:
Use itertools.repeat() to provide a default third list for zip() that produces a continuous stream of a default value.
def func(task, a1, a2, a3 = None):
if a3 is None:
a3 = itertools.repeat(None)
for t1, t2, t3 in zip(a1, a2, a3):
// do someting
CodePudding user response:
Not clear what the problem is with your existing code, but you could rearrange it like this:
def func(task, *args):
for items in zip(*args):
if task == "abc":
item1, item2 = items
# do something with them
else:
item1, item2, item3 = items
# do something with these
or this:
def func(task, t1, t2, t3=None):
if task == "abc":
lists = [t1, t2]
else:
lists = [t1, t2, t3]
for items in zip(*lists):
#... as above
or you could use an iterable that endlessly yields None as the default argument:
from itertools import repeat
def func(task, t1, t2, t3=repeat(None)):
for item1, item2, item3 in zip(t1, t2, t3):
# Now item3 will always be None if t3 is not specified
