簡體   English   中英

Python L系統的重寫系統

[英]Rewriting System for Python L-System

我有以下針對我制作的Python的工作代碼。 這是一個基於Lindenmayer的重寫系統。 輸出C為: +-LF+RFR+FL-F-+RF-LFL-FR+F+RF-LFL-FR+-F-LF+RFR+FL-+我可以解釋得出一個空間填充曲線。 C是起始字母,該過程執行了n次。

C = 'L'
n = 2
Code = {ord('L'):'+RF-LFL-FR+',
ord('R'):'-LF+RFR+FL-'}

while n:
    C = C.translate(Code)
    n -=1

print C

現在,我想從列表中自動編寫代碼。 例如,我有列表R=[['L', '+RF-LFL-FR+'], ['R', '-LF+RFR+FL-']] ,該列表應自動插入代碼中,因此我可以再使用它。 每個子列表的第一個元素應插入ord()方法中,第二個元素應插入冒號之后。 有什么建議么?

我找到了一種通過列表理解的方法。 列表R是L=+RF-LFL-FR+, R=-LF+RFR+FL- 現在,我問是否有更有效的方法來獲取代碼?

R = ['L=+RF-LFL-FR+','R=-LF+RFR+FL-']
A = 'L'

for i in range(0,len(R)):
    R[i]=R[i].split('=')

print R

Start = []
Rule = []

for i in range(0,len(R)):
    Start.append(R[i][0])
    Rule.append(R[i][1])

#mapping via list comprehension
while n:
    A=''.join([Rule[Start.index(i)] if i in Start else i for i in A])
    n -=1

print A

顯然,這似乎為您工作。 該代碼在python3上運行。

def fun1(n):
    axiom = 'L'
    rules = ['L=+RF-LFL-FR+','R=-LF+RFR+FL-']

    # Convert the rules into a translation table.
    rules = [ r.split('=') for r in rules ]
    table = dict((ord(key), value) for (key, value) in dict(rules).items())

    # Expand
    string = axiom
    for i in range(n):
        string = string.translate(table)
    return string

編輯 :我發現了第二種方法,利用內置的map功能:

def fun2(n):
    axiom = 'L'
    rules = ['L=+RF-LFL-FR+','R=-LF+RFR+FL-']

    # Convert the rules into a translation table.
    rules = [ r.split('=') for r in rules ]
    table = dict(rules)
    lookup = lambda c: table[c] if c in table else c

    string = axiom
    for i in range(n):
        # Map
        string = map(lookup, string)
        # "Reduce": from list of strings to string
        string = ''.join(string)
    return string

時間 :為了檢查運行時,我對n=10了候選,這導致結果字符串包含大約3'500'000個字符。 您的實現(當然沒有打印操作)我命名為fun3(n) 我在ipython使用%timeit命令測量的結果。

%timeit fun1(n=10)
10 loops, best of 3: 143 ms per loop

%timeit fun2(n=10)
10 loops, best of 3: 195 ms per loop

%timeit fun3(n=10)
10 loops, best of 3: 152 ms per loop

系統:Python 3.5.2。,MacBook Pro(Retina,15英寸,2015年中),2.8 GHz Intel Core i7。

簡介 :我的第一個建議和您的實現速度差不多一樣快,在我的版本上有一點優勢,尤其是在可讀性方面。 map方法無法奏效。

我還嘗試了第四個版本,在該版本中預分配了輸出數組,但是在運行時涉及了代碼,並且python的內存分配邏輯明顯比我的預分配方法好2倍。 我沒有對此進一步調查。

我希望這可以幫到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM