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

2014 年 6 月 19 日
 kzing
单纯的实现从'a'到'z'的遍历不难, 但是如果要实现这样的
输入: ('ab'..'xy').to_a

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

可能就比较复杂

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

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

当然……ruby里的这个字符串succ的行为有很多特例。。。唯一能正确实现的办法……恐怕只能是把 http://www.ruby-doc.org/core-2.1.2/String.html#method-i-succ 的代码翻译成Python了……
glasslion
2014 年 6 月 20 日
@shyrock 那么'asfedfger'..'rghrehtrh' 也用多重循环来写?
generic
2014 年 6 月 20 日
@Kabie 这个例子告诉我们,在X语言社区里问“Y语言的某功能在X语言里怎么实现”,最好先说明其在Y语言里的行为。
wangtai
2014 年 6 月 20 日
小弟不懂Ruby,请问各位Ruby大神,这种写法一般在什么场景下使用啊
est
2014 年 6 月 20 日
哈哈,LZ这个卡位比较好。几个python解结果和LZ的结果不一样。
kzing
2014 年 6 月 20 日
@generic 原来V2EX已经默认位Ptyhon社区了吗= =!
generic
2014 年 6 月 20 日
kzing
2014 年 6 月 20 日
@generic 这不是更惨吗...那我应该会有这样的回复" 这是Ruby的板块, 你提问Python的问题?"
hahastudio
2014 年 6 月 20 日
关键是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 年 6 月 20 日
写个函数吧。。
to_a('aa','zz') rets ['aa',...,'zz']
shyrock
2014 年 6 月 20 日
@glasslion 不懂ruby,'asfedfger'..'rghrehtrh' 出怎样的结果?
fwee
2014 年 6 月 20 日
@shyrock 取下一个值会调用next方法,很类似haskell,一般都是1..9这种数字范围
binux
2014 年 6 月 20 日
这个返回里面有 az 吗?如果有 az 为什么会有,不是只到 xy 吗?那有 aA,aZ 吗?
不理解这个函数是干嘛的。
manfay
2014 年 6 月 20 日
如果返回里有 az ,那么这个函数就是 Python 想要避免的 implicit.

Explicit is better than implicit.
blacktulip
2014 年 6 月 20 日
此贴好好玩,you are not your programming language. 不用觉得伤自尊。
Kabie
2014 年 6 月 20 日
https://github.com/topazproject/topaz/blob/master/topaz/objects/stringobject.py#L274

String#succ 的 python 版。。。。。。其实和 C 没啥区别了。。。
reusFork
2014 年 6 月 20 日
jinyiming321
2014 年 6 月 20 日
ruby这个是抄perl的。。。

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

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

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

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

© 2021 V2EX