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

标签 python list pseudocode

这是我的目标:我有 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/

相关文章:

c++ - 在 C++ 中创建正弦查找表

algorithm - 两个矩形相交

python - 如何修复表 x 没有名为 y 的列?

python - 在具有外键字段的表上批量插入

c# - Find() 与列表上的枚举

python - 检查字典值的范围

java - 在 Java 中将分数转换为单词

python - 用条件替换字符串会产生奇怪的结果

Python unittest 分支覆盖似乎错过了 zip 中执行的生成器

list - 可以在查询字符串中使用 != 吗?