2013-04-13 76 views
0

我正在使用递归函数在迷宫中创建流程路径。该函数返回正确的路径元组(行,列),但我需要它的元组列表的形式。比如我需要但该函数返回此创建这个表单扁平化Python中的元组列表

[(0,0),(1,1),(2,2),(3,3),(4,3)] 

[(0, 0), [(1, 1), [(2, 2), [(3, 3), (4, 3)]]]] 

下面是函数:

def FlowPathAt(fdir,row,col): 
    lItem = FlowOut(fdir,row,col) 
    if not lItem: 
     return (row,col) 
    else: 
     r,c = lItem 
     return [(row,col) , FlowPathAt(fdir,r,c)] 

FlowOut(fdir,row,col)是返回的下一个单元格地址的功能从(行,列)开始

有什么办法可以将这个lis弄平在构建期间?

类似:How to flatten a list of tuples into a pythonic list

回答

6

试试这个:

def FlowPathAt(fdir,row,col): 
    lItem = FlowOut(fdir,row,col) 
    if not lItem: 
     return [(row,col)] # More convenient base case 
    else: 
     r,c = lItem 
     return [(row,col)] + FlowPathAt(fdir,r,c) # Append list to list instead of nesting 

(这总是返回一个元组列表,太多,这似乎只是有时比返回一个列表,有时候返回一个元组一个更好的主意。如果这是不可接受的,你需要做一些后处理。)

+0

非常好,非常感谢。 – user2278537

4

这是很多列表增长的内存管理,为什么不把它重构成生成器函数:

def FlowPathAt(fdir, row, col): 
    while True: 
     yield row, col 
     lItem = FlowOut(fdir, row, col) 
     if lItem is None: break 
     row, col = lItem 
+0

谢谢您的输入,我会尝试这种方法。几个星期以来一直只用Python工作,但我真的很喜欢这种语言。此外,这个网站是非常有用的答案。感谢所有帮助别人学习的人。 – user2278537