Python 怎么优雅的实现 Ruby 的('a'..'z').to_a 操作?

2014-06-19 23:31:20 +08:00
 kzing
单纯的实现从'a'到'z'的遍历不难, 但是如果要实现这样的
输入: ('ab'..'xy').to_a

输出: ["ab", "ac", "ad",... ... ,"xw", "xx", "xy"]

可能就比较复杂

有比较Pythonic的方法或者算法吗?
8919 次点击
所在节点    Python
44 条回复
s51431980
2014-06-20 09:46:09 +08:00
当大牛花了半小时想出两行pythonic代码的时候,实习生用几分钟写了四行简明但看起来不pythonic的代码实现了相同的功能
shyrock
2014-06-20 10:11:50 +08:00
就代码易读易理解来说,我觉得5楼的最好。而且我认为这就是优雅。
Kabie
2014-06-20 10:29:18 +08:00
很可惜上面所有直接遍历的实现都是错的…………至少……和Ruby里的行为不同……

这个还是朴实的做个生成器吧。。。

当然……ruby里的这个字符串succ的行为有很多特例。。。唯一能正确实现的办法……恐怕只能是把 http://www.ruby-doc.org/core-2.1.2/String.html#method-i-succ 的代码翻译成Python了……
glasslion
2014-06-20 10:37:01 +08:00
@shyrock 那么'asfedfger'..'rghrehtrh' 也用多重循环来写?
generic
2014-06-20 10:43:22 +08:00
@Kabie 这个例子告诉我们,在X语言社区里问“Y语言的某功能在X语言里怎么实现”,最好先说明其在Y语言里的行为。
wangtai
2014-06-20 11:48:34 +08:00
小弟不懂Ruby,请问各位Ruby大神,这种写法一般在什么场景下使用啊
est
2014-06-20 12:02:13 +08:00
哈哈,LZ这个卡位比较好。几个python解结果和LZ的结果不一样。
kzing
2014-06-20 12:04:49 +08:00
@generic 原来V2EX已经默认位Ptyhon社区了吗= =!
generic
2014-06-20 12:13:32 +08:00
kzing
2014-06-20 12:26:50 +08:00
@generic 这不是更惨吗...那我应该会有这样的回复" 这是Ruby的板块, 你提问Python的问题?"
hahastudio
2014-06-20 12:46:46 +08:00
关键是LZ太欺负人= =
不给清楚里面怎么迭代的= =
哪知道"ax"后面是 "ay", "az", "ba", "bb" 啊= =
这应该是从aa到zz里面掐了ab到xy这一段= =

我给一个比较Pythonic的方案,在14L @mulog 的方案上稍微改一下就可以
反正没有缩进,就直接在这里贴了
用了''.join(t),这样你想涨长就改repeat和if里的边界就好了= =

import string
import itertools

s = string.ascii_lowercase
result = [ ''.join(t) for t in itertools.product(s, repeat=2) if "ab" <= ''.join(t) <= "xy" ]
yuankui
2014-06-20 13:21:44 +08:00
写个函数吧。。
to_a('aa','zz') rets ['aa',...,'zz']
shyrock
2014-06-20 13:23:37 +08:00
@glasslion 不懂ruby,'asfedfger'..'rghrehtrh' 出怎样的结果?
fwee
2014-06-20 13:33:00 +08:00
@shyrock 取下一个值会调用next方法,很类似haskell,一般都是1..9这种数字范围
binux
2014-06-20 14:12:07 +08:00
这个返回里面有 az 吗?如果有 az 为什么会有,不是只到 xy 吗?那有 aA,aZ 吗?
不理解这个函数是干嘛的。
manfay
2014-06-20 14:55:42 +08:00
如果返回里有 az ,那么这个函数就是 Python 想要避免的 implicit.

Explicit is better than implicit.
blacktulip
2014-06-20 14:56:20 +08:00
此贴好好玩,you are not your programming language. 不用觉得伤自尊。
Kabie
2014-06-20 16:07:16 +08:00
https://github.com/topazproject/topaz/blob/master/topaz/objects/stringobject.py#L274

String#succ 的 python 版。。。。。。其实和 C 没啥区别了。。。
reusFork
2014-06-20 16:48:40 +08:00
jinyiming321
2014-06-20 18:24:55 +08:00
ruby这个是抄perl的。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/118528

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX