【问题标题】:Creating a list without back-to-back repetitions from multiple repeating elements [duplicate]从多个重复元素创建一个没有背靠背重复的列表[重复]
【发布时间】:2020-07-11 23:19:15
【问题描述】:

我正在尝试从多个重复元素创建一个列表(类型并不重要,只要它们都相同),其中给定元素不会连续重复。或者换句话说,结果列表中从索引 n 到索引 n+1 不应该有重复。

更具体地说,我有例如...

shape_typesA = [1, 1, 2, 2]
shape_typesB = [2, 2, 1, 3]

...我想随机将它们组合在一个列表中,如下所示:

shape_typesALL = [2, 1, 2, 1, 2, 1, 2, 3]

每个原始列表的每个元素(即shape_typesA / shape_typesB)只允许在结果列表中出现一次(即shape_typesALL)。列表通常具有相同的长度。如果没有解决方案,应该会引发错误。

这个问题的最佳解决方案是什么?

【问题讨论】:

  • 那么它是否有任何区别 which 输入列表一个元素来自,或者问题完全等同于选择一个包含所有输入列表的适当排列元素?
  • @alaniwi 理想情况下这很重要,但选择包含所有元素的单个输入列表的适当排列也足以满足我目前的情况。

标签: python list random


【解决方案1】:
from random import shuffle
list = shuffle(list)


def no_repeats_list(old_list):
    new_list = []
    for i in range(len(old_list) - 1):
        if old_list[i] != old_list[i+1]:
            new_list.append(old_list[i])
    new_list.append(old_list[-1])
    return new_list

【讨论】:

  • 这是一个很好的方法,但通常会找到一个解决方案,其中并非来自old_list所有 元素最终都出现在 new_list 中。
【解决方案2】:
  • 将项目分隔到容器中,其中容器中的所有项目相等
  • 根据长度开发循环序列。
    • 识别序列中从一个容器到下一个容器的长度差异为 2 或更多——间隙
  • 从最长的容器开始并删除一个项目 - 跟踪列表长度
  • 按顺序继续从下一个容器中移除一个项目
    • 使用物品数量最少或最多的容器中的物品(无序)来尝试保持一个容器与下一个容器之间的长度差异为一个或更少

【讨论】:

    【解决方案3】:

    列表可以有重复值,但集合不能有重复值,因此将组合列表转换为集合,然后再将其转回列表。

    查看下面的代码。

    shape_typesA = [1, 1, 2, 2]
    shape_typesB = [2, 2, 1, 3]
    shap = shape_typesA+shape_typesB
    shap = set (shap)
    shap = list(shap)
    print (shap)
    

    在输出中你会得到一个没有重复字符的列表。

    【讨论】:

    • 这将从列表中删除所有重复项。但是,我需要最终列表包含每个原始列表中的所有元素(无论是否重复)。从 n 到 n+1,它们不应该是相同的。
    猜你喜欢
    • 2021-03-21
    • 2021-06-17
    • 1970-01-01
    • 2020-02-27
    • 2016-12-24
    • 1970-01-01
    • 2013-04-27
    • 2021-08-08
    • 2020-01-07
    相关资源
    最近更新 更多