在Python中,我可以:
from itertools import product
k = 3
for kmer in product("AGTC", repeat=k):
print(kmer)
在Rust中,我可以通过以下方式强制k=3
的行为:
#[macro_use] extern crate itertools;
for kmer in iproduct!("AGTC".chars(), "AGTC".chars(), "AGTC".chars()){
println!("{:?}", kmer);
}
但是如果我想要k=4
或k=5
呢?
2条答案
按热度按时间ggazkfy81#
为任意类型的任意k编写一个合适的泛化是很困难的,因为返回类型可以是任意大小的元组。如果你只想处理
String
,这就容易多了:playgroundn53p2ov02#
我在4年后才回答这个问题,一方面是因为公认的答案太复杂了,另一方面是因为Python的
itertools.product
是一个泛型函数(而公认的答案只对String
有效)。此外,请注意,公认答案中定义的kproduct
函数是递归的,Rust doesn't guarantee tail-call optimization。使用第三方itertools机箱,我们可以通过两种方式定义
product_repeat
函数:或者通过定义标准的顶级函数,或者通过为所有Iterator
添加ProductRepeat
特征。这是顶级函数:
如果您更喜欢增加Iterator特性,可以按如下方式进行:
这是Rust playground中的一个演示。