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的内存分配逻辑在运行时的表现清楚地胜过了我的PREALLOCATION方法2。我没有进一步调查。

最新更新