Объединение двух несопоставимых отсортированных списков элементов с сохранением их относительного порядка в python3 - PullRequest
1 голос
/ 12 марта 2019

У меня есть два упорядоченных списка с несопоставимыми элементами:

l1 = [1, 2, 3, 4]  
l2 = [obj1, obj2, obj3]  

Я хочу случайным образом объединить их в один список, но сохранить их относительный порядок, например:

ml = [1, 2, obj1, obj2, 3, obj3, 4]  

или

ml = [obj1, 1, 2, 3, obj2, obj3, 4]  

Буду признателен, если кто-нибудь поможет мне.

1 Ответ

3 голосов
/ 12 марта 2019

Простая функция, которая изменяет ввод и возвращает список:

import random

l1 = [1, 2, 3, 4]
l2 = ["obj1", "obj2", "obj3"]

def merge_random(lists):
    res = []
    while lists:
        li = random.choice(lists)
        res.append(li.pop(0))
        lists = [li for li in lists if li]
    return res

print(merge_random((l1, l2)))

Пример вывода:

['obj1', 'obj2', 1, 2, 'obj3', 3, 4]

Генератор, более питонное решение

Это решениебыло предложено Джоном Клементсом .Он использует генератор и не изменяет пользовательский ввод.Это явно более питоническое решение проблемы.

import random

def f(*iterables):
    todo = [iter(it) for it in iterables]
    while todo:
        idx = random.randrange(len(todo))
        try:
            yield next(todo[idx])
        except StopIteration:
            del todo[idx]

Его можно использовать так:

l1 = [1, 2, 3, 4]
l2 = ["obj1", "obj2", "obj3"]

for i in f(l1, l2):
    print(i)

Пример вывода:

obj1
1
2
obj2
obj3
3
4
...