我有以下问题:
首先,我有一个如下列的元组列表:
[(1,2),(2,3),(4,5),(5,6),(5,7),(5,8),(6,9),(6,10),(7,11),(12,14)]
为了简单起见,让我们说每个元组中的第一个数字'控制'第二个(对于那些熟悉依赖解析的人来说,第一个数字代表头部的索引,而第二个数字代表依赖的索引)
现在我要创建的是一个函数,它将int
和上面的列表作为参数。该函数必须查找所有具有第一个数字整数参数的元组并返回第二个数字。然后该函数应递归地取这些第二个数字中的每一个,看看它作为第一个数字出现的元组是什么,并返回第二个数字。这应该继续,直到无法检索到其他第二个数字。
我将用一个例子来更好地解释它:
假设这个函数将数字5作为输入。具有5作为第一个数字的元组是(5,6),(5,7),(5,8)
;作为第一个结果,函数应该取6,7,8并将其追加到list
。现在函数应该考虑6,7,8,查找它们作为第一个数字出现的元组((6,9),(6,10),(7,11)
)并返回第二个数字(9,10,11)。由于8在任何元组中都不是第一个数字,因此它的旅程在此阶段结束。返回的最终列表应为[6,7,8,9,10,11]
。
我尝试了类似的东西,但它不起作用:
def foo(start_index, lista_tuples,list_to_return=list()):
indeces=[x[1] for x in lista_tuples if x[0]==start_index]
list_to_return.extend(indeces)
for index in indeces:
foo(index,lista_tuples,list_to_return)
return list_to_return
但它不起作用。有人能帮我吗?
答案 0 :(得分:1)
>>> L =[(1,2),(2,3),(4,5),(5,6),(5,7),(5,8),(6,9),(6,10),(7,11),(12,14)]
>>> def foo(start, L, answer=None):
... if answer is None:
... answer = []
... answer += [i[1] for i in L if i[0]==start]
... for i in (i[1] for i in L if i[0]==start):
... foo(i, L, answer)
... return answer
...
>>> print foo(5, L)
[6, 7, 8, 9, 10, 11]
答案 1 :(得分:1)
在你的代码中,你总是迭代你找到的所有“第二个值”。
这可以产生无限递归。
要避免这种情况,请从indeces
中删除list_to_return
中已有的所有值:
def foo(start_index, lista_tuples,list_to_return=list()):
indeces=[x[1] for x in lista_tuples if x[0]==start_index]
new_values = list(set(indeces) - set(list_to_return))
list_to_return.extend(indeces)
for index in new_values:
foo(index,lista_tuples,list_to_return)
return list_to_return
双转换列表 - > set->列表有点矫枉过正,但写下来需要三秒钟:D
编辑:事实上,你应该使用一套。这样可以避免重复。
答案 2 :(得分:1)
功能方式
def worker(n):
data = []
for j in [x[1] for x in l if x[0] == n]:
data += [j] + worker(j)
return data
print worker(5)
[6, 9, 10, 7, 11, 8]
程序方式
def worker(n, data):
for j in [x[1] for x in l if x[0] == n]:
data.append(j)
worker(j, data)
d = []
worker(5, d)
print d
[6, 9, 10, 7, 11, 8]
答案 3 :(得分:0)
您应该查看此popular question,这可以解释为什么在您的函数中使用可变的默认值可能会导致问题。
def foo(start_index, lista_tuples):
return _foo(start_index, lista_tuples, [])
def _foo(start_index, lista_tuples,list_to_return):
indeces=[x[1] for x in lista_tuples if x[0]==start_index]
list_to_return.extend(indeces)
for index in indeces:
_foo(index,lista_tuples,list_to_return)
return list_to_return