吧务
level 10
Tuples是区分元素顺序的,Subsets忽视重复元素也不能生成重复元素。非要搞Orderless的Tuples的话似乎效率也不高。有没有什么好的解决方案?
2019年11月27日 13点11分
1
吧务
level 9
以前贴吧讨论过这个问题,你找的函数应该是python中的itertools.combinations_with_replacement吧,现在那个帖子找不到了。下面是一种方法,速度一般
combinWithRep[list_List, k_Integer] := Block[{v, it, cf},
v = Table[Unique[], {k}];
it = Thread[{v, {1}~Join~Most@v, Length@list}];
cf = {it, First /@ it} /. {{iter__}, var_} :>
Hold@Block[{bag = Internal`Bag@Rest@{0}},
Do[Internal`StuffBag[bag, var, 1], iter];
bag~Internal`BagPart~All] /. Hold[x_] :> Compile[{}, x];
Part[list, cf[]]~Partition~k
];
2019年11月27日 14点11分
2
谢了。话说这是我第一次见到用Internal`的函数写的代码,这个要怎么学啊
2019年11月28日 02点11分
吧务
level 9
另一种比较简洁的实现,速度慢一些
combinationsWithReplacement[A_List,k_Integer]:=Extract[A,{#-Range[0,k-1]}&/@Subsets[Range[Length[A]+k-1],{k}]];
2019年11月29日 04点11分
3