Python 中的重复排列

2023-12-31

我想迭代一个的所有顶点n尺寸为 1 的维度立方体。我知道我可以做到这一点itertools.product如下:

>>> n = 3
>>> for j in it.product((0,1), repeat=n) :
...     print j
... 
(0, 0, 0)
(0, 0, 1)
(0, 1, 0)
(0, 1, 1)
(1, 0, 0)
(1, 0, 1)
(1, 1, 0)
(1, 1, 1)

但我需要根据顶点的数量来区别对待每个顶点1在其坐标中找到 s,即(0, 1, 1), (1, 0, 1) and (1, 1, 0)都会受到相同的待遇,因为他们都有两个1s。而不是使用上面的迭代器,然后计数1s,我想生成按数量排序的笛卡尔积1s,大致如下:

>>> for ones in xrange(n) :
...     for seq in magic_expression(ones, n) :
...         print ones, seq
... 
0 (0, 0, 0)
1 (0, 0, 1)
1 (0, 1, 0)
1 (1, 0, 0)
2 (0, 1, 1)
2 (1, 0, 1)
2 (1, 1, 0)
3 (1, 1, 1)

我的高中数学老师会这样称呼这些2 个元素的排列n一次,第一个元素重复n - ones次,以及第二次ones times,并且很容易证明有n! / ones! / (n - ones)!其中。

根据维基百科 http://en.wikipedia.org/wiki/Permutation#Generation_in_lexicographic_order我可以按字典顺序生成它们,如下所示:

def lexicographical(ones, n) :
    perm = [0] * (n - ones) + [1] * ones
    yield tuple(perm)
    while True :
        k = None
        for j in xrange(n - 1) :
            if perm[j] < perm[j + 1] :
                k = j
        if k is None :
            break
        l = k + 1
        for j in xrange(k + 2, n) :
            if perm[k] < perm[j] :
                l = j
        perm[k], perm[l] = perm[l], perm[k]
        perm[k+1:] = perm[-1:k:-1]
        yield tuple(perm)

但计时起来,这只会在计算完整的笛卡尔积时开始得到回报n >= 10,然后仅对于ones < 2,这不是典型的用例。有没有一种优雅的方法来加速我上面的代码,也许有一些强大的itertools巫术,还是完全使用不同的算法?如果有什么区别的话,我不在乎产生的排列的顺序。或者我应该放弃计数?


EDIT


如果您编写了超过八行代码来生成八个常量值,则说明出现了问题。

除了嵌入我想要的列表之外,我会用愚蠢的方式来做:

vertices = (
    (v.count(1), v)
    for v in itertools.product((0, 1), repeat=3)
)
for count, vertex in sorted(vertices):
    print vertex

除非您使用 1000 个超立方体,否则您不应该有任何巨大的性能担忧。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 中的重复排列 的相关文章

随机推荐

  • 如何在 JavaScript 中找到整数的质因数?

    我试图找到一个数字的质因数 在下面使用 JavaScript 中的 for 循环记录为 整数 我似乎无法让它工作 我不确定这是我的 JavaScript 还是我的计算逻辑 integer is the value for which we
  • Haskell:如何将 IO 输入字符串解析为 Float(或 Int 或其他)?

    我正在尝试制作一个程序 该程序接受用户通过键盘输入的浮点数字并对其进行处理 然而 每次我尝试将输入的字符串解析为浮点数时 我都会收到错误 我尝试过的每一种方法都无法让我获取用户输入的数据并将其转换为我需要的浮点数 我的练习计划 不是我要解决
  • 泰坦数据损坏

    我在调用时遇到异常com tinkerpop blueprints Edge getLabel在某些顶点边上 java lang IllegalStateException Could not find type for id 630 at
  • 填充 int 数组从零到定义的数字

    我需要将 C 中的 int 数组从零填充到变量定义的数字 但 ISO C 禁止可变长度数组 如何轻松填充数组 我需要分配 释放内存吗 int possibilities SIZE unsigned int i 0 for i 0 i lt
  • wix 安装程序ice03 无效语言 ID

    我有一个夜间版本 它在与我的不同的机器上运行在我的机器上 我可以毫无问题地编译安装程序并使用 msi然而在晚上构建机器时我得到 C Builds 73 Tools AppInstaller src AppInstaller APPExpor
  • Python - 无限 While 循环

    我不明白为什么底部的 while 循环是无限循环 User enters a positive integer number user input int input Please enter a positive integer numb
  • Swing 中的交互式平面直线图

    我正在尝试在 JApplet 上绘制交互式平面直线图 PSLG 我使用鼠标单击来确定 PSLG 的顶点 这是我用来绘制 PSLG 边缘的算法 1 将用户执行鼠标单击的点添加为 PSLG 的顶点 2 如果他单击第二个点 则该点和先前单击的点之
  • Crockford 风格的上下文着色是否在任何代码编辑器中实现?

    我观看了 YUIConf 2012 的视频 其中 Douglas Crockford 发表了有关在 JavaScript 中实现 monad 的演讲 在本次演讲中 他给出了一个代码示例 该示例利用了他所谓的 上下文着色 它抛弃了按语言语法着
  • 为什么具有 UNC 路径的 .NET 的 File.Open 会进行过多的 SMB 调用?

    我有一段代码需要使用 UNC 路径从 NAS 服务器打开并读取大量小文本文件 此代码是最初用 C 编写的模块的一部分 但现在正在转换为 C C 版本明显慢一些 我确定打开文件的调用几乎是所有性能差异的原因 使用 WireShark 我发现这
  • 在 Linq 查询中比较 byte[]

    我的 SQL 表中有一个二进制列 我使用以下 C 代码成功查询了该表 var hash http www whatever com ToSHA256HashBytes var landingPage context LandingPages
  • 使用 Order By 函数计算两点之间的距离(长、纬度)时 MySQL 查询速度变慢

    我在 MySQL 中有一个查询 它在表的每一行上运行一个存储函数 然后根据函数的结果对行进行排序 然后返回前 10 行 SELECT rowId MyFunction x y constX constY AS funResult FROM
  • 使用 C# 将 UTF-8 转换为 Unicode

    请帮帮我 我在 GET 请求后编码响应字符串时遇到问题 var m refWebClient new WebClient var m refStream m refWebClient OpenRead this m refUri var m
  • Django:使用排除的字段验证 ModelForm 中的 unique_together 约束

    我有一个表格 class CourseStudentForm forms ModelForm class Meta model CourseStudent exclude user 对于具有一些复杂要求的模型 class CourseStu
  • 给定的二叉树是否完整[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 给定一个二叉树 编写一个函数来检查给定的二叉树是否是完全二叉树 完全二叉树是这样的二叉树 除了最后一层之外 每一层都被完全填满 并且所有节
  • NHibernate Criteria 根据另一个表中的 itemid 的分组依据和总和来选择项目

    public class SearchText public virtual int Id get set public virtual string Text get set public class SearchTextLog publ
  • iOS 8+ 远程通知功能始终启用

    仅适用于 iOS gt 8 在我的 AppDelegate 中 我注册用户通知 如下所示 BOOL application UIApplication application didFinishLaunchingWithOptions NS
  • 从动态库调用 fprintf (c++)

    我正在创建一个包含日志记录类的 Windows DLL 库 该类中的日志函数只是像这样调用 fprintf 来进行测试 fprintf stderr 调试 s n 你好 现在 如果我从其他项目 使用该库 中的任何文件中的任何函数使用它 这个
  • 更改字体很棒的图标中的字体大小

    我正在使用 parallax pro genesis 子主题 因此我正在小部件区域内工作 我不确定我是否以正确的方式处理这个问题 但我尝试通过在小部件区域中执行此操作 在很棒的字体图标下进行书写 i class fa fa code fa
  • 当“try .. except IOError”没有捕获FileNotFoundError时如何处理它?

    如何捕获 python 3 上的错误 我用谷歌搜索了很多 但似乎没有一个答案有效 文件 open txt 不存在 因此应该打印 e errno 这就是我现在尝试的 这是我定义的函数 try with open file r as file
  • Python 中的重复排列

    我想迭代一个的所有顶点n尺寸为 1 的维度立方体 我知道我可以做到这一点itertools product如下 gt gt gt n 3 gt gt gt for j in it product 0 1 repeat n print j 0