2016-02-01 39 views
0

我试图创建一个递归函数,它需要一个JSON字典并将任何具有键名'rate'的值存储到列表中。然后我会拿这个清单并找到最低价值。我的代码现在看起来像这样,但是在列表中产生了多个空列表。在递归循环中追加到列表

def recurse_keys(df): 
    rates = [] 
    for key, value in df.items(): 
     if key == 'rate': 
      rates.append(value) 
     if isinstance(df[key], dict): 
      recurse_keys(df[key]) 
+3

因为你在每个递归调用上做'rates = []'。 – Maroun

+0

通过率作为递归函数的参数 – kilojoules

+0

每次调用'recurse_keys'时,它都会创建一个新的'rates'列表,该列表最初是空的。想必这不是你想要的。 –

回答

6

您需要的结果从递归结合,并将其返回:

def recurse_keys(df): 
    rates = [] 
    for key, value in df.items(): 
     if key == 'rate': 
      rates.append(value) 
     if isinstance(df[key], dict): 
      rates += recurse_keys(df[key]) 
    return rates 
+0

这是完美的工作。谢谢! – Casey

+0

@Casey'df [key]'和'value'是一样的,不是?是否有理由混合? – Jason

+0

@Fabricator这个方法是否优于以下建议(通过'rate')?这种方法看起来不那么直观,但也许我错了? – Jason

0
  1. ,结果从递归调用
  2. 不要忘记返回延长你的结果你的结果

代码:

def recurse_keys(df): 
    rates = [] 
    for key, value in df.items(): 
     if key == 'rate': 
      rates.append(value) 
     if isinstance(df[key], dict): 
      rates += recurse_keys(df[key]) 
    return rates 
0

您需要合格率作为费率,似乎在每次递归中您都会创建新费率列表。

def recurse_keys(df, rates=[]): 
    for key, value in df.items(): 
     if key == 'rate': 
      rates.append(value) 
     if isinstance(df[key], dict): 
      recurse_keys(df[key], rates) 
    return rates 

result = recurse_keys(df) 
min(result) 
+0

对可变默认参数非常小心 – timgeb

+0

请检查http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argument。 –

+0

我从来没有遇到这种用法的问题,但这并不意味着我不会确实,谢谢@Rogalski,@ timgeb。我会更加小心。 – FatmaT

0

您也可以初始化率列表中的递归函数之外,并把它传递给函数,list是一个可变的数据结构,它会作为引用传递。像这样(虽然没有经过测试):

def recurse_keys(df, rates): 
    for key, value in df.items(): 
     if key == 'rate': 
      rates.append(value) 
     if isinstance(df[key], dict): 
      recurse_keys(df[key], rates) 

def calling_method(): 
    rates = [] 
    recurse_keys(df, rates)