这是我的目标:我有不同大小的 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种不同类型的文章(新闻,教程和评论),我们会为我们的博客生成建议/推荐文章的列表。
答案 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))