I have two lists:
a = [1, 2, 3, 5]
b = ["a", "b", "c", "d"]
And would like to generate all possible combinations with a python generator. I know I could be doing:
combinations = list(itertools.product(a,b))
random.shuffle(combinations)
But that one has an extreme memory cost as i would have to hold in memory all possible combinations, even if only wanted two random unique combinations.
My target is to get a python generator that has its memory cost increase with the more iterations are requested from it, getting to the same O memory cost as itertools at max iterations.
I had this for now:
def _unique_combinations(a: List, b: List):
"""
Creates a generator that yields unique combinations of elements from a and b
in the form of (a_element, b_element) tuples in a random order.
"""
len_a, len_b = len(a), len(b)
generated = set()
for i in range(len_a):
for j in range(len_b):
while True:
# choose random elements from a and b
element_a = random.choice(a)
element_b = random.choice(b)
if (element_a, element_b) not in generated:
generated.add((element_a, element_b))
yield (element_a, element_b)
break
But its flawed as it can theoretically run forever if the random.choice lines are unlucky.
I'm looking to modify that existing generator so it generates the indexes randomly within a fix set of time, it will be okay to keep them track of as this will be linear increase in memory cost and not exponential.
How could i modify that random index generator to be bound in time?
Aucun commentaire:
Enregistrer un commentaire