如何确定性地交织不同长度的N个异构列表?

时间:2015-02-12 00:23:39

标签: python list pseudocode

这是我的目标:我有不同大小的 N列表(让他们说N = 3),每个列表包含不同类型的项目,而且我的目标是' d需要生成包含所有这些内容的单个列表最小化相同类型的相邻项目的数量

我个人使用python,但任何伪代码解决方案都会被接受。

示例:

A = [a1, a2, a3]
B = [b1, b2]
C = [c1, c2, c3, c4]

OUT = f(A, B, C)
> [a1, b1, c1, a2, b2, c2, a3, c3, c4]

在上面的示例中,我只是简单地同时迭代3个列表并从每个列表中挑选一个项目,直到每个项目都被采用。它非常简单,快速且具有确定性。 (注意:相邻的相似项目的数量没有最佳地最小化,但是在大多数用例中我们说它是可以容忍的)

BUT

我更愿意避开 a,b,c,a,b,c,... 模式,让它看起来更自然"虽然仍然确定性(读取:相同输入,相同输出)。

示例:

OUT = [a1, b1, c1, b2, a2, c2, a3, c3, c4]

有什么建议吗?

P.S。对于一个真实世界的例子,让这些3个列表包含3种不同类型的文章(新闻,教程和评论),我们会为我们的博客生成建议/推荐文章的列表。

2 个答案:

答案 0 :(得分:1)

这是我的建议:

import random

def mix(ls):
    random.seed(0)

    final_length = sum([len(l) for l in ls])
    r = []
    while len(r) < final_length:
        l = ls[random.randint(0, len(ls) - 1)]
        if len(l) > 0:
            r.append(l.pop())    
    return r

然后,您可以将其用于:

a = ['a1', 'a2', 'a3']
b = ['b1', 'b2']
c = ['c1', 'c2', 'c3', 'c4']

r = mix([a, b, c])

结果将是:

['c4', 'c3', 'b2', 'a3', 'b1', 'c2', 'a2', 'c1', 'a1']

答案 1 :(得分:0)

import random

def interleave(*lists):
    random.seed("OWA TAGOO SIAM") #ensures deterministic behaviour
    lists = list(lists) # so its mutable 
    for i in range(max(map(len,lists))): 
        random.shuffle(lists) #randomize the order of the lists
        for j in lists:
            if i < len(j):
                yield j[i]

A = [a1, a2, a3]
B = [b1, b2]
C = [c1, c2, c3, c4]    

print list(interleave(A,B,C))