一个全面的高性能排列库。
permuta的Python项目详细描述
permuta是一个用于处理perms(permutation的缩写)的python库, 图案和网格图案。
安装
要在系统上安装Permuta,请运行:
pip install permuta
也可以在开发模式下安装permuta来处理 源代码,在这种情况下,克隆存储库后运行以下命令:
./setup.py develop
运行单元测试:
pip install -r test_requirements.txt
./setup.py test
使用permuta
一旦安装了permuta,就可以通过python脚本或 交互式python会话,就像任何其他python库一样:
>>>frompermutaimport*
从中导入*将为您提供“perm”和“permset” 类以及用于生成 烫发避免一组图案。它还为你提供了“meshpatt”课程 以及本自述中我们将不讨论的其他子模块。
创建单个烫发
置换在置换中是基于零的,可以使用任何iterable创建。
>>>Perm()# Empty permPerm(())>>>Perm([])# Another empty permPerm(())>>>Perm((0,1,2,3))# The zero-based version of 1234Perm((0,1,2,3))>>>Perm((2,1,3))# Warning: it will initialise with any iterablePerm((2,1,3))>>>Perm((2,1,3),check=True)# If you are unsure, you can checkTraceback(mostrecentcalllast):...ValueError:Elementoutofrange:3>>>Perm((4,2,3,0,0),check=True)Traceback(mostrecentcalllast):...ValueError:Duplicateelement:0>>>Perm("123",check=True)Traceback(mostrecentcalllast):...TypeError:''1''objectisnotaninteger
置换也可以使用一些特定的类方法创建。
>>>Perm.from_string("201")# stringsPerm((2,0,1))>>>Perm.one_based((1,3,2,4))# one-based iterable of integersPerm((0,2,1,3))>>>Perm.to_standard("a2gsv3")# standardising any iterable using '<'Perm((2,0,3,4,5,1))>>>Perm.from_integer(210)# an integer between 0 and 9876543210Perm((2,1,0))>>>Perm.from_integer(321)# any integer given is standardisedPerm((2,1,0))>>>Perm.from_integer(201)Perm((2,0,1))
打印烫发会给出基于零的字符串。
>>>print(Perm(()))ε>>>print(Perm((2,1,0)))210>>>print(Perm((6,2,10,9,3,8,0,1,5,11,4,7)))62(10)938015(11)47
“避免”、“包含”和“发生”方法允许使用模式:
>>>p=Perm((0,2,1,3))>>>p.contains(Perm((2,1,0)))False>>>p.avoids(Perm((0,1)))False>>>list(p.occurrences_of(Perm((1,0))))[(1,2)]>>>list(Perm((0,1)).occurrences_in(p))[(0,1),(0,2),(0,3),(1,3),(2,3)]
实现了基本的对称性:
>>>[p.reverse(),p.complement(),p.inverse()][Perm((3,1,2,0)),Perm((3,1,2,0)),Perm((0,2,1,3))]
为了得到直接和和和和和和,我们使用+和-:
>>>q=Perm((0,1,2,3,4))>>>p+qPerm((0,2,1,3,4,5,6,7,8))>>>p-qPerm((5,7,6,8,0,1,2,3,4))
有许多实用方法可供选择:
>>>list(p.fixed_points())[0,3]>>>list(p.ascents())[0,2]>>>list(p.descents())[1]>>>list(p.inversions())[(1,2)]>>>p.major_index()2
创建perm类
您可能需要所有烫发的设置:
>>>all_perms=PermSet()>>>print(all_perms)<Thesetofallperms>
perm类可以用basis指定:
>>>basis=[Perm((1,0,2)),Perm((1,2,0))]>>>basis[Perm((1,0,2)),Perm((1,2,0))]>>>perm_class=Av(basis)>>>perm_classAv((Perm((1,0,2)),Perm((1,2,0))))
当基由单个元素组成时,可以直接传递给av
>>>q=Perm((1,0))>>>len(Av(q).of_length(100))1
您可以询问烫发是否属于烫发类:
>>>Perm((3,2,1,0))inperm_classTrue>>>Perm((0,2,1,3))inperm_classFalse
您可以获取类的第n个perm或迭代:
>>>sorted([perm_class[n]forninrange(8)])[Perm(()),Perm((0,)),Perm((0,1)),Perm((1,0)),Perm((0,1,2)),Perm((0,2,1)),Perm((2,0,1)),Perm((2,1,0))]>>>perm_class_iter=iter(perm_class)>>>sorted([next(perm_class_iter)for_inrange(8)])[Perm(()),Perm((0,)),Perm((0,1)),Perm((1,0)),Perm((0,1,2)),Perm((0,2,1)),Perm((2,0,1)),Perm((2,1,0))]
(谨防:Lexicographic订单目前无法保证!)
perm类的子集,其中perm是特定长度
可以在perm类中定义特定长度的perm的子集:
>>>perm_class_14=perm_class.of_length(14)>>>perm_class_14Av((Perm((1,0,2)),Perm((1,2,0)))).of_length(14)
您可以要求子集的大小,因为它保证是有限的:
>>>len(perm_class_14)8192
迭代和包含功能与perm_类相同, 但是索引还有待实现:
>>>Perm((2,1,0))inperm_class_14False>>>Perm((0,13,1,12,2,3,4,11,5,10,6,7,8,9))inperm_class_14True>>>Perm(range(10))-Perm(range(4))inperm_class_14False>>>next(iter(perm_class_14))inperm_class_14True
许可证
bsd-3:请参阅LICENSE文件。