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