免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6063 | 回复: 13
打印 上一主题 下一主题

python 代码转 Perl [复制链接]

论坛徽章:
1
狮子座
日期:2013-12-16 16:09:24
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-05-04 15:48 |只看该作者 |倒序浏览
有个Python代码不解
方括号里带了for操作,这种代码如何转换为Perl代码?
s = [(word[:i], word[i:]) for i in range(len(word) + 1)]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2014-05-04 16:09 |只看该作者
回复 1# ttcn_cu


    这个你先应该到 Python 版问明白它是做什么的,然后才是重新实现的问题。

论坛徽章:
1
狮子座
日期:2013-12-16 16:09:24
3 [报告]
发表于 2014-05-04 16:15 |只看该作者
回复 2# MMMIX


    说不定Perler里有懂python的,同时我也在google啊

论坛徽章:
1
狮子座
日期:2013-12-16 16:09:24
4 [报告]
发表于 2014-05-04 17:04 |只看该作者
>>> word="hello"
>>> [(word[:i], word[i:]) for i in range(len(word) + 1)]
[('', 'hello'), ('h', 'ello'), ('he', 'llo'), ('hel', 'lo'), ('hell', 'o'), ('hello', '')]
>>>

原来是tuple in list
Perl里好像没有tuple

1         您不能向 tuple 增加元素。Tuple 没有 append 或 extend 方法。
2         您不能从 tuple 删除元素。Tuple 没有 remove 或 pop 方法。
3         您不能在 tuple 中查找元素。Tuple 没有 index 方法。
4         然而,您可以使用 in 来查看一个元素是否存在于 tuple 中。

那么使用 tuple 有什么好处呢?

    Tuple 比 list 操作速度快。如果您定义了一个值的常量集,并且唯一要用它做的是不断地遍历它,请使用 tuple 代替 list。
    如果对不需要修改的数据进行 “写保护”,可以使代码更安全。使用 tuple 而不是 list 如同拥有一个隐含的 assert 语句,说明这一数据是常量。如果必须要改变这些值,则需要执行 tuple 到 list 的转换 (需要使用一个特殊的函数)。
    还记得我说过 dictionary keys 可以是字符串,整数和 “其它几种类型”吗?Tuples 就是这些类型之一。Tuples 可以在 dictionary 中被用做 key,但是 list 不行。实际上,事情要比这更复杂。Dictionary key 必须是不可变的。Tuple 本身是不可改变的,但是如果您有一个 list 的 tuple,那就认为是可变的了,用做 dictionary key 就是不安全的。只有字符串、整数或其它对 dictionary 安全的 tuple 才可以用作 dictionary key。
    Tuples 可以用在字符串格式化中,我们会很快看到。

注意
Tuple 可以转换成 list,反之亦然。内置的 tuple 函数接收一个 list,并返回一个有着相同元素的 tuple。而 list 函数接收一个 tuple 返回一个 list。从效果上看,tuple 冻结一个 list,而 list 解冻一个 tuple。

论坛徽章:
1
狮子座
日期:2013-12-16 16:09:24
5 [报告]
发表于 2014-05-04 17:44 |只看该作者
论坛人气不够啊
自己找到答案了
这个Python的代码的对应Perl代码如下

(感觉Perl的实现方法太不优雅了, $1 $2 $1, 感觉像喊号子,可能我的实现比较功利)
  1. alphabet = 'abcdefghijklmnopqrstuvwxyz'

  2. def edits1(word):
  3.    s = [(word[:i], word[i:]) for i in range(len(word) + 1)]
  4.    deletes    = [a + b[1:] for a, b in s if b]
  5.    transposes = [a + b[1] + b[0] + b[2:] for a, b in s if len(b)>1]
  6.    replaces   = [a + c + b[1:] for a, b in s for c in alphabet if b]
  7.    inserts    = [a + c + b     for a, b in s for c in alphabet]
  8.    return set(deletes + transposes + replaces + inserts)
复制代码
  1. my @Alphabet = split //,'abcdefghijklmnopqrstuvwxyz';
  2. sub Edits1{
  3.         my $Word = shift;
  4.         my @Deletes;
  5.         my @Transposes;
  6.         my @Replaces;
  7.         my @Inserts;
  8.         for my $i (0..length($Word)){
  9.                 $Word=~/^(.{$i})((.?)((.?)(.*)))$/;
  10.                 push @Deletes,$1.$4;
  11.                 push @Transposes, $1.$5.$3.$6;
  12.                 if ($2){
  13.                         push @Replaces, $1.$_.$4 for @Alphabet;
  14.                 }
  15.                 push @Inserts, $1.$_.$2 for @Alphabet;
  16.         }

  17.         say Dumper \@Deletes;
  18.         say Dumper \@Transposes;
  19.         say Dumper \@Replaces;
  20.         say Dumper \@Inserts;
  21. }
复制代码

论坛徽章:
0
6 [报告]
发表于 2014-05-04 17:57 |只看该作者
本帖最后由 sjdy521 于 2014-05-04 17:59 编辑

回复 4# ttcn_cu


    如果依葫芦画瓢,不考虑perl style的话,是不是这样写?
  1. $word="hello";
  2. @word=split//,$word;
  3. push @s,[join("",@word[0..$_-1]),join("",@word[$_..$#word])] for(0..@word+1);

  4. use Data::Dumper;
  5. print Dumper \@s
复制代码
输出:
  1. [
  2.           [
  3.             '',
  4.             'hello'
  5.           ],
  6.           [
  7.             'h',
  8.             'ello'
  9.           ],
  10.           [
  11.             'he',
  12.             'llo'
  13.           ],
  14.           [
  15.             'hel',
  16.             'lo'
  17.           ],
  18.           [
  19.             'hell',
  20.             'o'
  21.           ],
  22.           [
  23.             'hello',
  24.             ''
  25.           ],
  26.           [
  27.             'hello',
  28.             ''
  29.           ]
  30.         ];
复制代码
用perl6应该会更舒服些

论坛徽章:
0
7 [报告]
发表于 2014-05-04 18:11 |只看该作者
本帖最后由 sjdy521 于 2014-05-04 18:12 编辑

回复 5# ttcn_cu


    如果要用正则,这样ok?

$word="hello";
push @s,[$`,$&.$'] while($word=~//g);
use Data:umper;
print Dumper \@s;




输出结果:
  1. [
  2.           [
  3.             '',
  4.             'hello'
  5.           ],
  6.           [
  7.             'h',
  8.             'ello'
  9.           ],
  10.           [
  11.             'he',
  12.             'llo'
  13.           ],
  14.           [
  15.             'hel',
  16.             'lo'
  17.           ],
  18.           [
  19.             'hell',
  20.             'o'
  21.           ],
  22.           [
  23.             'hello',
  24.             ''
  25.           ]
  26.         ];
复制代码
]

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
8 [报告]
发表于 2014-05-04 21:07 |只看该作者
  1. 和楼上的思路大同小异
  2. perl -MData::Dumper -le '$s="12345";while($s=~//g){push @a,[substr($s,0,pos($s)),substr($s,pos($s))]};print Dumper \@a'
  3. $VAR1 = [
  4.           [
  5.             '',
  6.             '12345'
  7.           ],
  8.           [
  9.             '1',
  10.             '2345'
  11.           ],
  12.           [
  13.             '12',
  14.             '345'
  15.           ],
  16.           [
  17.             '123',
  18.             '45'
  19.           ],
  20.           [
  21.             '1234',
  22.             '5'
  23.           ],
  24.           [
  25.             '12345',
  26.             ''
  27.           ]
  28.         ];

复制代码

论坛徽章:
1
狮子座
日期:2013-12-16 16:09:24
9 [报告]
发表于 2014-05-04 22:12 |只看该作者
回复 7# sjdy521


    对的,不过见一次说一次

Match variable used at line 3, column 10.  See page 82 of PBP.  Severity: 4
http://perl-critic.stacka.to/pod ... hibitMatchVars.html

论坛徽章:
1
狮子座
日期:2013-12-16 16:09:24
10 [报告]
发表于 2014-05-04 22:14 |只看该作者
大家都答对了,期待Perl6版本
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP