合并两个无法比较的元素排序列表,保持它们在python3中的相对排序

问题描述 投票:1回答:1

我有两个有无可比拟元素的​​有序列表:

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]  

如果有人帮助我,我将不胜感激。

python python-3.x list random merge
1个回答
3
投票

修改输入并返回列表的简单函数:

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]

发电机,更加pythonic解决方案

这个解决方案是由Jon Clements提出的。它使用generator并且不修改用户输入。这显然是解决这个问题的更加pythonic的解决方案。

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
© www.soinside.com 2019 - 2024. All rights reserved.