这是我的目标:我有 N 个列表(假设 N=3),每个列表包含不同类型的项目,我需要生成一个列表 包含所有这些,尽量减少相同类型的相邻项目的数量。
我个人使用 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 个列表并从每个列表中选择一个项目,直到每个项目都被取走。它非常简单、快速且具有确定性。 (注意:相邻相似项的数量并未最佳地最小化,但可以说在大多数用例中是可以容忍的)
但是
我宁愿避免 a,b,c,a,b,c,... 模式,让它看起来更“自然”,尽管仍然确定性(阅读:相同的输入,相同的输出)。
例子:
OUT = [a1, b1, c1, b2, a2, c2, a3, c3, c4]
有什么建议吗?
附言举一个真实世界的例子,让我们想象一下这 3 个列表包含 3 种不同类型的文章(新闻、教程和评论),我们正在为我们的博客生成建议/推荐文章列表。
最佳答案
这是我的建议:
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']
关于python - 如何确定性地交错 N 个不同长度的异构列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28467172/