繁体   English   中英

Python to Perl:itertools产品在每个可能的位置替换字符串中的char

[英]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 :: ProductAlgorithm :: 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

让我们看看我做了什么:

  • Perl中的函数在数组@_获取其参数(读取:at-underscore)。 shift该数组将产生第一个参数。 因为shift隐式作用于@_您可以忽略它。
  • Perl的split使用正则表达式作为分隔符。 我们使用了/ / ,这是一个空格。
  • Math :: Cartesian :: Product导出的cartesian函数采用一个BLOCK和一堆数组引用。 BLOCK之后没有逗号。 这是传递代码引用(lambda函数)的简写。
  • q {}是一个引号般的操作是相同的'' ,但可读性就像是一个单一的空间,更好的东西
  • x运算符用于列表时,将其重复n次。 我们重复的列表只有一个元素,数组引用带有空格 和一个破折号-在其中。
  • 当强制进入scalar上下文时,Perl中的数组将返回元素数。
  • 如果两个数组的大小不同,则List :: MoreUtils中的zipundef填充较小的列表。 因为这会在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM