RLE(游程编码)模式似乎在我的工作中出现了很多。从RLE模式中删除代码重复,而不使用Haskell?
其实质是,您输出的是自上次'休息'以来遇到的元素的减少,每次您看到'break'或您到达输入的末尾。
(在实际RLE中,“破发”就是这种性格不匹配的最后一个字符,但在现实世界中,通常是一个稍微复杂一些,但仍然是当前和最后一个元素的功能。)
我想删除在循环和结尾都出现的重复last_val != None: rle.append((last_val, count))
条件和操作。
的问题是:
- 在更多的代码与函数调用的结果替换它们,而不是更少。
- 保持它的命令式(例如,在Haskell,问题只是蒸发)。
当务之急Python代码是:
#!/usr/bin/env python
data = "abbbccac"
if __name__ == '__main__':
rle = []
last_val = None
count = 0;
for val in data:
if val != last_val and last_val != None:
rle.append((last_val, count))
count = 1
else:
count += 1
last_val = val
if last_val != None:
rle.append((last_val, count))
print rle
P.S.在函数式语言平凡解:
#!/usr/bin/env runhaskell
import Data.List (group)
dat = "abbbccac"
rle :: Eq a => [a] -> [(a, Int)]
rle arr = map (\g -> (head g, length g)) $ group arr
main :: IO()
main = print $ rle dat
对于它的价值,在Haskell你只需要'RLE =地图(头&&&长度) 。 group'。 – 2012-07-06 08:52:38
@Frerich Raabe - 谢谢,我不知道&&&操作符。无点式风格仍然比“正常”的Haskell看起来少得多。 – fadedbee 2012-07-06 10:26:55
'&&&'函数(来自'Control.Arrow')非常流行,所以大多数Haskell程序员都会识别它。我认为它也是非常具有说服力的,我将'map(head &&& length)'看作是“将函数头部和长度映射到...上”。我喜欢'&&&'如何对应于“和”。 – 2012-07-06 11:28:33