[英]Python to perl: itertools product to replace a char in string in each possible position
以下python代码使我能够采用一串单词,并在每种可能的组合中用连字符替换空格:
from itertools import product
def dashed_combos(inputstring):
words = inputstring.split()
for combo in product(' -', repeat=len(words) - 1):
yield ''.join(w for pair in zip(words, combo + ('',)) for w in pair)
这将从字符串convert perl to-python
产生以下组合
'convert perl-to python'
'convert-perl to python'
'convert perl-to-python'
'convert-perl-to python'
'convert-perl-to-python'
我现在正尝试对perl做完全一样的事情。 我发现了一些可以产生笛卡尔乘积的模块(例如Math :: Cartesian :: Product和Algorithm :: Loops中的嵌套循环 ),尽管对perl不那么熟悉,但我一直在努力使它们起作用在python中效果很好的东西。 如果有人愿意在这里为我提供帮助,那就太好了,因为我已经花了很长时间尝试了,但没有一点高兴。
使用Math :: Cartesian :: Product可以几乎完全翻译您的代码。 您将在List :: MoreUtils中找到zip
文件 。
use strict;
use warnings;
use feature 'say';
use Math::Cartesian::Product;
use List::MoreUtils 'zip';
sub dashed_combos {
my @words = split / /, shift;
my @permutations;
foreach my $product ( cartesian { return @_ } ([ q{ }, q{-}]) x scalar @words - 1 ) {
push @permutations, join q{}, grep { defined } zip @words, @$product;
}
return @permutations;
}
say for dashed_combos('convert perl to python' );
这将输出:
convert perl to python
convert perl to-python
convert perl-to python
convert perl-to-python
convert-perl to python
convert-perl to-python
convert-perl-to python
convert-perl-to-python
让我们看看我做了什么:
@_
获取其参数(读取:at-underscore)。 shift
该数组将产生第一个参数。 因为shift
隐式作用于@_
您可以忽略它。 split
使用正则表达式作为分隔符。 我们使用了/ /
,这是一个空格。 cartesian
函数采用一个BLOCK
和一堆数组引用。 BLOCK
之后没有逗号。 这是传递代码引用(lambda函数)的简写。 ''
,但可读性就像是一个单一的空间,更好的东西
。 x
运算符用于列表时,将其重复n次。 我们重复的列表只有一个元素,数组引用带有空格
和一个破折号-
在其中。 scalar
上下文时,Perl中的数组将返回元素数。 zip
用undef
填充较小的列表。 因为这会在join
ed时发出警告,所以我们只需要grep
defined
(不是undef
)。 @$product
正在取消对数组的数组引用。 您可以尝试Algorithm::Combinatorics
:
#!/usr/bin/env perl
use strict;
use warnings;
use Algorithm::Combinatorics qw( variations_with_repetition );
use List::MoreUtils qw( zip );
my $input_string = join ' ', @ARGV;
print "Input string is '$input_string'\n";
my $tokens = ' -';
my @parts = split /[$tokens]/, $input_string;
print "My string parts are : ", join (', ', map { "'$_'" } @parts) . "\n";
my @tokens_to_use = split //, $tokens;
my @combos = variations_with_repetition( \@tokens_to_use, scalar @parts - 1 );
for my $combo (@combos) {
my $string_variety = join '', zip( @parts, @$combo );
print $string_variety . "\n";
}
哪个输出:
Input string is 'convert perl to-python'
My string parts are : 'convert', 'perl', 'to', 'python'
convert perl to python
convert perl to-python
convert perl-to python
convert perl-to-python
convert-perl to python
convert-perl to-python
convert-perl-to python
convert-perl-to-python
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.