创建两个列表中所有可能的项目组合的元组,而不在元组中重复项目

2023-12-28

我希望能够获取一系列数字并返回一个包含三元组且不重复的列表。 x 的每个元素应该在三元组的每个位置出现一次。目标是得到如下内容:

get_combinations_without_duplicates(3) = [(0, 1, 2), (1, 2, 0), (2, 0, 1)]

对于范围(3),这只是列表旋转,但对于更高的范围,有更多可能的组合。我希望能够随机生成满足这些约束的三元组列表。

假设我们首先指定 n=4 情况下每个三元组的第一个元素:

[(0,),(1,),(2,),(3,)]

第一个三元组的第二个元素可以是 0 以外的任何值。一旦选择其中一个,就会限制下一个三元组的选项,依此类推。目标是拥有一个函数,它接受一个数字并以这种方式创建三元组,但并不总是创建相同的三元组集合。也就是说,最终结果可能是旋转:

[(0, 1, 2), (1, 2, 3), (2, 3, 0), (3, 0, 1),]

or

[(0, 2, 3), (1, 3, 0), (2, 0, 1), (3, 1, 2)]

下面是这个函数的一个实现:

def get_combinations_without_duplicates(n):
    output = []
    second = range(n)
     third = range(n)
for i in range(n):
    triple = [i]
    #Get the second value of the triple, but make sure that it isn't a 
    #duplicate of the first value
    #in the triple or any value that has appeared in the second position of any triple
    choices_for_second = [number for number in second if number not in triple]
    #Randomly select a number from the allowed possibilities
    n_second = random.choice(choices_for_second) 
    #Append it to the triple
    triple.append(n_second)
    #Remove that value from second so that it won't be chosen for other triples
    second = [number for number in second if number != n_second]
    #Do the same for the third value
    choices_for_third = [number for number in third if number not in triple]
    n_third = random.choice(choices_for_third)
    triple.append(n_third)
    third = [number for number in third if number != n_third]
    output.append(tuple(triple))
return output

如下所述,此过程有时会随机选择不起作用的组合。如果你这样做,就可以解决这个问题:

def keep_trying(n):
    try:
        return get_combinations_without_duplicates(n)
    except IndexError:
        return keep_trying(n)

但是,我想知道是否有更好的方法来做到这一点。


让我们再试一次。

一些观察。

  1. 在元组的排序数组中,第一个值始终为零。
  2. 数组的长度始终与数组中存在的元组的数量一样长。
  3. 你希望这些是randomly生成的。
  4. 元组按“排序”顺序生成。

根据这些规范,我们可以提出一个程序方法;

  1. 生成 2 个序列整数列表,一个用于选择,另一个用于种子。
  2. 对于种子列表中的每个数字,[0, 1, 2, 3],随机追加和删除元素中尚未存在的数字。[01, 13, 20, 32]
  3. 生成另一个序列整数列表,然后重复。[012, 130, 203, 321]

但是,这行不通。对于某些迭代,它会退回到角落并且无法生成数字。例如,[01, 13, 20, 32].. appending [3, 0, 1... crap, I'm stuck.

解决这个问题的唯一方法是做一个true洗牌整行,然后重新洗牌,直到适合为止。这可能需要相当长的时间,并且随着组数的增加,只会变得更加痛苦。

所以,从程序上来说:

解决方案一:随机生成

  1. 用您的范围填充列表。 [0,1,2,3]
  2. 创建另一个列表。 [0,1,2,3]
  3. 随机排列列表。 [1,0,2,3]
  4. 随机播放,直到找到适合的... [1, 2, 3, 0]
  5. 对第三个元素重复上述操作。

通过此过程,虽然计算机可以verify解决方案非常快,它不能generate解决方案非常快。然而,它只是生成真正随机答案的两种方法之一。

因此,最快的保证方法将使用验证过程,而不是生成过程。首先,生成所有可能的排列。

from itertools import permutations

n = 4
candidates = [i for i in permutations(xrange(n),3)]

Then.

解决方案2:随机验证

  1. 选择一个以 0 开头的三元组。
  2. 随机弹出一个不以 0 开头的三元组。
  3. 验证随机选取的三元组是否是中间解决方案。
  4. 如果没有,则弹出另一个三元组。
  5. 如果是,则附加三元组,并且重新填充三元组队列.
  6. 重复n次。 # 或者直到你耗尽队列,此时repeat n次自然就变为TRUE

下一个三元组的解决方案在数学上保证位于解决方案集中,因此如果您只是让它自行耗尽,那么应该会出现一个随机解决方案。这种方法的问题在于,不能保证每个possible结果有一个equal可能性。

解决方案3:迭代验证

对于等概率结果,摆脱随机化,并生成每个可能的三元组组合,n 长列表 - 并验证每个候选解决方案。

编写一个函数verify列出要产生的候选解决方案every解决方案,然后从该列表中随机弹出一个解决方案。

from itertools import combinations

results = [verify(i) for i in combinations(candidates, n)]
# this is 10626 calls to verify for n=4, 5 million for n=5 
# this is not an acceptable solution.  

解决方案 1 或 3 都不是很快,O(n**2),但根据您的标准,如果您想要一个真正随机的解决方案,这可能是尽可能快的。解决方案 2 肯定是这三种方案中最快的,通常会明显优于 1 或 3,解决方案 3 的结果最稳定。您选择哪种方法取决于您想要对输出执行什么操作。

之后:

最终,代码的速度将完全取决于多么随机你希望你的代码是。一种吐出满足您要求的元组系列的第一个(并且只是第一个)实例的算法可以运行得非常快,因为它只按顺序攻击排列一次,并且它将在 O(n) 时间内运行。然而,它不会随机做任何事情......

另外,这里有一些 verify(i) 的快速代码。它基于这样的观察:两个元组在同一索引中可能不具有相同的数字。

def verify(t):
    """ Verifies that a set of tuples satisfies the combinations without duplicates condition. """
    zipt = zip(*t)
    return all([len(i) == len(set(i)) for i in zipt])

n = 4 完整解决方案集

((0, 1, 2), (1, 0, 3), (2, 3, 0), (3, 2, 1))
((0, 1, 2), (1, 0, 3), (2, 3, 1), (3, 2, 0))
((0, 1, 2), (1, 2, 3), (2, 3, 0), (3, 0, 1))
((0, 1, 2), (1, 3, 0), (2, 0, 3), (3, 2, 1))
((0, 1, 3), (1, 0, 2), (2, 3, 0), (3, 2, 1))
((0, 1, 3), (1, 0, 2), (2, 3, 1), (3, 2, 0))
((0, 1, 3), (1, 2, 0), (2, 3, 1), (3, 0, 2))
((0, 1, 3), (1, 3, 2), (2, 0, 1), (3, 2, 0))
((0, 2, 1), (1, 0, 3), (2, 3, 0), (3, 1, 2))
((0, 2, 1), (1, 3, 0), (2, 0, 3), (3, 1, 2))
((0, 2, 1), (1, 3, 0), (2, 1, 3), (3, 0, 2))
((0, 2, 1), (1, 3, 2), (2, 0, 3), (3, 1, 0))
((0, 2, 3), (1, 0, 2), (2, 3, 1), (3, 1, 0))
((0, 2, 3), (1, 3, 0), (2, 0, 1), (3, 1, 2))
((0, 2, 3), (1, 3, 2), (2, 0, 1), (3, 1, 0))
((0, 2, 3), (1, 3, 2), (2, 1, 0), (3, 0, 1))
((0, 3, 1), (1, 0, 2), (2, 1, 3), (3, 2, 0))
((0, 3, 1), (1, 2, 0), (2, 0, 3), (3, 1, 2))
((0, 3, 1), (1, 2, 0), (2, 1, 3), (3, 0, 2))
((0, 3, 1), (1, 2, 3), (2, 1, 0), (3, 0, 2))
((0, 3, 2), (1, 0, 3), (2, 1, 0), (3, 2, 1))
((0, 3, 2), (1, 2, 0), (2, 1, 3), (3, 0, 1))
((0, 3, 2), (1, 2, 3), (2, 0, 1), (3, 1, 0))
((0, 3, 2), (1, 2, 3), (2, 1, 0), (3, 0, 1))

n = 5 有 552 个独特的解决方案。这是前 20 个。

((0, 1, 2), (1, 0, 3), (2, 3, 4), (3, 4, 0), (4, 2, 1))
((0, 1, 2), (1, 0, 3), (2, 3, 4), (3, 4, 1), (4, 2, 0))
((0, 1, 2), (1, 0, 3), (2, 4, 0), (3, 2, 4), (4, 3, 1))
((0, 1, 2), (1, 0, 3), (2, 4, 1), (3, 2, 4), (4, 3, 0))
((0, 1, 2), (1, 0, 4), (2, 3, 0), (3, 4, 1), (4, 2, 3))
((0, 1, 2), (1, 0, 4), (2, 3, 1), (3, 4, 0), (4, 2, 3))
((0, 1, 2), (1, 0, 4), (2, 4, 3), (3, 2, 0), (4, 3, 1))
((0, 1, 2), (1, 0, 4), (2, 4, 3), (3, 2, 1), (4, 3, 0))
((0, 1, 2), (1, 2, 0), (2, 3, 4), (3, 4, 1), (4, 0, 3))
((0, 1, 2), (1, 2, 0), (2, 4, 3), (3, 0, 4), (4, 3, 1))
((0, 1, 2), (1, 2, 3), (2, 0, 4), (3, 4, 0), (4, 3, 1))
((0, 1, 2), (1, 2, 3), (2, 0, 4), (3, 4, 1), (4, 3, 0))
((0, 1, 2), (1, 2, 3), (2, 3, 4), (3, 4, 0), (4, 0, 1))
((0, 1, 2), (1, 2, 3), (2, 4, 0), (3, 0, 4), (4, 3, 1))
((0, 1, 2), (1, 2, 3), (2, 4, 1), (3, 0, 4), (4, 3, 0))
((0, 1, 2), (1, 2, 4), (2, 0, 3), (3, 4, 0), (4, 3, 1))
((0, 1, 2), (1, 2, 4), (2, 0, 3), (3, 4, 1), (4, 3, 0))
((0, 1, 2), (1, 2, 4), (2, 3, 0), (3, 4, 1), (4, 0, 3))
((0, 1, 2), (1, 2, 4), (2, 3, 1), (3, 4, 0), (4, 0, 3))
((0, 1, 2), (1, 2, 4), (2, 4, 3), (3, 0, 1), (4, 3, 0))

因此,您可以生成这样的解决方案,但这需要时间。如果您要使用它,我将按原样缓存生成的解决方案,然后在您需要任何数量 n 时随机从中提取它们。顺便说一句,n=5 需要不到一分钟的时间才能完成,暴力破解。由于解决方案是 O(n**2),我预计 n=6 需要一个多小时,n=7 需要一天。获得真正的随机解决方案的唯一方法就是这样做。

Edited:无均等分布的随机解:

以下是我在尝试解决此问题时编写的代码,是解决方案2。我想我应该发布它,因为它是一个部分的、非均等分配的解决方案,并且生成所有可能的解决方案,保证,给予足够的时间。

def seeder(n):
    """ Randomly generates the first element in a solution. """
    seed = [0]
    a = range(1, n)
    for i in range(1, 3):
        seed.append(a.pop(random.randint(0,len(a)-1)))
    return [seed]

def extend_seed(seed, n):
    """ Semi-Randomly generates the next element in a solution. """
    next_seed = [seed[-1][0] + 1]
    candidates = range(0, n)
    for i in range(1, 3):
        c = candidates[:]
        for s in next_seed:
            c.remove(s)
        for s in seed:
            try:
                c.remove(s[i])
            except ValueError:
                pass
        next_seed.append(c.pop(random.randint(0,len(c)-1)))
    seed.append(next_seed)
    return seed

def combo(n):
    """ Extends seed until exhausted. 
    Some random generations return results shorter than n. """
    seed = seeder(n)
    while True:
        try:
            extend_seed(seed, n)
        except (ValueError, IndexError):
            return seed

def combos(n):
    """ Ensures that the final return is of length n. """
    while True:
        result = combo(n)
        if len(result) == n:
            return result
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

创建两个列表中所有可能的项目组合的元组,而不在元组中重复项目 的相关文章

  • 如何替换 Pandas Dataframe 中不在列表中的所有值? [复制]

    这个问题在这里已经有答案了 我有一个值列表 如何替换 Dataframe 列中不在给定值列表中的所有值 例如 gt gt gt df pd DataFrame D ND D garbage columns S gt gt gt df S 0
  • 在 Python 中解析 TCL 列表

    我需要在双括号上拆分以空格分隔的 TCL 列表 例如 OUTPUT 172 25 50 10 01 01 Ethernet 172 25 50 10 01 02 Ethernet Traffic Item 1 172 25 50 10 01
  • 如何在 __init__ 中使用await设置类属性

    我如何定义一个类await在构造函数或类体中 例如我想要的 import asyncio some code class Foo object async def init self settings self settings setti
  • VSCode Settings.json 丢失

    我正在遵循教程 并尝试将 vscode 指向我为 Scrapy 设置的虚拟工作区 但是当我在 VSCode 中打开设置时 工作区设置 选项卡不在 用户设置 选项卡旁边 我还尝试通过以下方式手动转到文件 APPDATA Code User s
  • 我应该使用 Python 双端队列还是列表作为堆栈? [复制]

    这个问题在这里已经有答案了 我想要一个可以用作堆栈的 Python 对象 使用双端队列还是列表更好 元素数量较少还是数量较多有什么区别 您的情况可能会根据您的应用程序和具体用例而有所不同 但在一般情况下 列表非常适合堆栈 append is
  • 使用主题交换运行多个 Celery 任务

    我正在用 Celery 替换一些自制代码 但很难复制当前的行为 我期望的行为如下 创建新用户时 应向tasks与交换user created路由键 该消息应该触发两个 Celery 任务 即send user activate email
  • python multiprocessing 设置生成进程等待

    是否可以生成一些进程并将生成进程设置为等待生成的进程完成 下面是我用过的一个例子 import multiprocessing import time import sys def daemon p multiprocessing curr
  • 更好地相当于这个疯狂的嵌套 python for 循环

    for a in map for b in map a for c in map b for d in map c for e in map d print a b c d e 上面的代码用于创建图中一定长度的所有路径 map a 表示从
  • 未知错误:Chrome 无法启动:异常退出

    当我使用 chromedriver 对 Selenium 运行测试时 出现此错误 selenium common exceptions WebDriverException Message unknown error Chrome fail
  • 嵌套作用域和 Lambda

    def funct x 4 action lambda n x n return action x funct print x 2 prints 16 我不太明白为什么2会自动分配给n n是返回的匿名函数的参数funct 完全等价的定义fu
  • python的shutil.move()在linux上是原子的吗?

    我想知道python的shutil move在linux上是否是原子的 如果源文件和目标文件位于两个不同的分区上 行为是否不同 或者与它们存在于同一分区上时的行为相同吗 我更关心的是如果源文件和目标文件位于同一分区上 shutil move
  • 当字段是数字时怎么说...在 mongodb 中匹配?

    所以我的结果中有一个名为 城市 的字段 结果已损坏 有时它是一个实际名称 有时它是一个数字 以下代码显示所有记录 db zips aggregate project city substr city 0 1 sort city 1 我需要修
  • Django 视图中的“请求”是什么

    在 Django 第一个应用程序的 Django 教程中 我们有 from django http import HttpResponse def index request return HttpResponse Hello world
  • 如何使用 Python 3 检查目录是否包含文件

    我到处寻找这个答案但找不到 我正在尝试编写一个脚本来搜索特定的子文件夹 然后检查它是否包含任何文件 如果包含 则写出该文件夹的路径 我已经弄清楚了子文件夹搜索部分 但检查文件却难倒了我 我发现了有关如何检查文件夹是否为空的多个建议 并且我尝
  • 为什么 csv.DictReader 给我一个无属性错误?

    我的 CSV 文件是 200 Service 我放入解释器的代码是 snav csv DictReader open screennavigation csv delimiter print snav fieldnames 200 for
  • 每当使用 import cv2 时 OpenCV 都会出错

    我在终端上使用 pip3 install opencv contrib python 安装了 cv2 并且它工作了 但是每当我尝试导入 cv2 或运行导入了 cv2 的 vscode 文件时 在 python IDLE 上它都会说 Trac
  • Firebase Firestore:获取文档的生成 ID (Python)

    我可以创建一个新文档 带有自动生成的 ID 并存储对其的引用 如下所示 my data key value doc ref db collection u campaigns add my data 我可以像这样访问数据本身 print d
  • 将索引与值交换的最快方法

    考虑pd Series s s pd Series list abcdefghij list ABCDEFGHIJ s A a B b C c D d E e F f G g H h I i J j dtype object 交换索引和值并
  • NLTK:查找单词大小为 2k 的上下文

    我有一个语料库 我有一个词 对于语料库中该单词的每次出现 我想获取一个包含该单词之前的 k 个单词和该单词之后的 k 个单词的列表 我在算法上做得很好 见下文 但我想知道 NLTK 是否提供了一些我错过的功能来满足我的需求 def size
  • 如何在Python脚本中从youtube-dl中提取文件大小?

    我是 python 编程新手 我想在下载之前提取视频 音频大小 任何 YouTube 视频 gt gt gt from youtube dl import YoutubeDL gt gt gt url https www youtube c

随机推荐

  • 无法在 Vim 中映射

    周末拿到了我的第一台 Mac 我正在努力适应 我的 vimrc 中的这一行在我的 Windows 上有效 但无法通过 iTerm 与 vim 一起工作 inoremap
  • 具有约束关联类型错误“类型不可转换”的 Swift 协议

    我创建了 2 个具有关联类型的协议 类型符合Reader应该能够生成符合以下类型的实例Value 复杂性层来自于符合以下条件的类型Manager应该能够生产混凝土Reader产生特定类型的实例Value 任何一个Value1 or Valu
  • */ 中 d 的 shell 脚本; do在本地运行,但在circleci中不起作用

    我构建了一个脚本 当我尝试在本地运行它时 它工作正常 但是当我在 Circleci 上运行它时 我收到错误 这是脚本 usr bin env bash for d in do cd d for f in do if f sh then if
  • 提示用户打开另一个工作簿

    我正在编写一个子程序 我需要用户打开特定的工作簿 因为我需要将数据从将打开的工作簿复制到运行该子程序的工作簿 由于将打开的文件是月度报告 因此用户很难始终将其以相同的文件名保存在同一位置 因此 如果要求用户打开工作簿 月度报告 那就太好了
  • VS Code 自动导入不使用绝对路径且不缩进

    我将 Typescript 与 SvelteKit 结合使用 当我输入可以自动导入的内容时 如上面的 GIF 所示 自动导入不会使内容保持相同的缩进级别 我还需要绝对路径 src not src VS 代码的设置称为 TypeScript
  • Magento 报告 - 产品 - 产品订购问题:具有相同 ID 的项目 (Mage_Catalog_Model_Product) 已存在

    问题 在 Magento 管理面板中 通过 报告 产品 订购的产品 生成报告时 会发生错误 Item Mage Catalog Model Product with the same id 45 already exist 0 home g
  • 读取文件中的每一行并将每一行放入一个字符串中

    我有一个文本文件 我想读入该文件并将文件中的每一行放入其自己的字符串中 所以该文件将有 4 行 2017 01 2005 59 30 353879833382971575 迈克尔 因此 在代码中 我需要读取文件并拆分每一行并将它们放入一个字
  • 垂直错开 div

    有没有办法像这张图片一样以交错的垂直排列方式显示 div 到目前为止 我已经使用 Flexbox 来接近 但无法交错行 因为我不想预先确定每行有多少个圆圈 我希望用户的浏览器宽度来控制每行有多少个圆圈 因此圆圈 div 上没有类或子项 随着
  • Play框架 路由不区分大小写

    我们目前正在开发 Play 2 5 x 我们希望实现不区分大小写的路由 比如说 GET via v1 organizations http organizationApi 在我们想要实现的URL中 http localhost 9000 a
  • MFC不支持小于0x0501的WINVER

    我有一个 C 项目引用了许多其他项目 库 这是针对多年前创建的应用程序 大约每年更新一次并完成新版本 我多年来一直使用 Visual Studio 6 更新和构建此应用程序的新版本 没有出现任何问题 我正在尝试切换到 Visual Stud
  • Python NLTK 多线程

    我正在编写一个算法 它可以识别给定文本中的句子 将每个句子拆分成单词并在经过一些验证后返回这些单词 我想在多线程的帮助下实现同样的功能 我正在调用处理每个句子的函数threading thread 它会抛出一个错误 AttributeErr
  • 如何在javascript中获取最高的输入字段值

    我想获得这个领域的最高价值 我怎样才能做到这一点
  • “始终开启”设置会阻止idleTimeout 和periodicRestart 吗?

    您可能知道 Microsoft Azure 网站服务下托管的网站默认配置为空闲 20 分钟后超时 idleTimeout 并且应用程序池每 29 小时重新启动一次 periodicRestart 这会导致第一个用户访问网站时速度很慢 我想知
  • 将 Recaptcha 与 EPiServer XForms 结合使用

    有人有在 EPiServer 中使用 Recaptcha 和 XForms 的经验吗 我不知道将 Recaptcha 控件放在哪里以及如何使其工作 ASP NET 的示例代码如下 我应该把它放在哪里 我的猜测是在FormControl Be
  • 多态推理

    我正在学习 Haskell 在互联网上我发现的是paper https people mpi sws org dreyer tor papers wadler pdf来自菲利普 瓦德勒 我读了它 但根本不明白 但它以某种方式与多态函数联系起
  • Internet Explorer CSS 问题

    This page http a accioly 7rtc com p tecnologia htmlIE 9 也可能是旧版本 无法正确呈现 右侧菜单浮动到页面底部 Firefox Chrome 和 Safari 可以正确渲染它 所有浏览器
  • DispatchQueue :无法在非主线程上使用 asCopy = NO 进行调用

    我正在介绍的是UIAlertController在主线程上为 class HelperMethodClass NSObject class func showAlertMessage message String viewControlle
  • java中使用wait()和notify()的简单场景

    我可以获得一个完整的简单场景 即建议如何使用它的教程 特别是使用队列 The wait and notify 方法旨在提供一种机制 允许线程阻塞直到满足特定条件 为此 我假设您想要编写一个阻塞队列实现 其中有一些固定大小的元素后备存储 您要
  • 如何从谷歌地图API获取导航持续时间和流量?

    我想通过 http 请求从 google 地图 api 获取导航持续时间 但我得到了没有流量的持续时间 我如何获得流量持续时间 您现在可以获得duration in traffic没有高级帐户 只需来自的标准 API 密钥开发者控制台 ht
  • 创建两个列表中所有可能的项目组合的元组,而不在元组中重复项目

    我希望能够获取一系列数字并返回一个包含三元组且不重复的列表 x 的每个元素应该在三元组的每个位置出现一次 目标是得到如下内容 get combinations without duplicates 3 0 1 2 1 2 0 2 0 1 对