Попробуйте объединить все 20 000 списков одновременно, а не два одновременно.
from itertools import zip_longest
from functools import partial
import random
lists = [l1, l2, ...]
idxvals = map(partial(filter, None), itertools.zip_longest(*lists))
newl = [random.choice([*i]) for i in idxvals]
Поскольку вы хотите выбрать случайный элемент в каждом индексе, имеет смысл выбирать из всех 20 000 списков одновременновместо 2 за один раз.
>>> lists = [[1, 2, 3], [10], [20, 30, 40, 5]]
zip_longest
перейдет к самому длинному списку, заполнив пропущенные значения None
.
>>> list(itertools.zip_longest(*lists))
[(1, 10, 20), (2, None, 30), (3, None, 40), (None, None, 5)]
Эти None необходимо будет отфильтровать перед выборомшаг.filter
поможет с этим.
>>> f = partial(filter, None)
>>> list(map(list, map(f, itertools.zip_longest(*lists))))
[[1, 10, 20], [2, 30], [3, 40], [5]]
Должно быть понятно, что я пытаюсь сделать.I-й индекс выходных данных содержит элементы, присутствующие в l[i]
, для каждого l
в lists
.
Теперь итерируйте по idxvals
и выберите:
>>> idxvals = map(f, itertools.zip_longest(*lists))
>>> [random.choice([*i]) for i in idxvals]
[10, 30, 3, 5]