【问题标题】:Function within if-statement not returning a value, instead getting "Name Error"if 语句中的函数不返回值,而是得到“名称错误”
【发布时间】:2021-12-16 00:04:29
【问题描述】:

我正在对地址进行一些模糊匹配,并以高分进行过滤。如果该分数存在于我的数据集中,那么我想调用另一个函数来查看数据并检查是否有与之关联的销售/电话。

我想最终返回一个符合该函数标准的值列表。在调试时,我可以看到“sales_and_calls_test”功能有效。我看到这些值被附加到我的列表中,但是,当我进行下一次迭代时,我看到我的调试手表中的列表从一个值更改为“名称错误:名称“call_list + sales_list”未定义

有人可以查看我的语法并告诉我我缺少什么吗?谢谢!

这是我的代码:


def sales_and_calls_test(v_sales, v_calls):
  calls_list = []
  sales_list = []
  if v_sales > 1:
    print(v_sales, v._1)
    sales_list.append(v_sales)

  if  v_calls > 1:
      print(v_calls, v._1)
      calls_list.append(v_calls)
  
  return calls_list, sales_list


for v in match_table.itertuples():
    #print(v)
    if not string_len_test(l.Address_1, v.Address_2):
       
       lev_score = lev(l.Address_1, v.Address_2)
       fuzz_score = fuzz.token_sort_ratio(l.Address_1, v.Address_2)
       if  fuzz_score >= 90:
          sales_and_calls_test(v._6, v._7)
          #print(lev_score, fuzz_score)
        else: 
          if fuzz_score == 87: 
            print('close', v.Address, l.Address_2, v._1, v._6, v._7, v._8)
            print(lev_score, fuzz_score)
    
    else:
      continue

##*** side note does anyone know why after I perform itertuples() 
## that some of my column's change from their names to _number? 

【问题讨论】:

  • 你的缩进在最后一个if/else 上很不稳定,我没有看到任何for 循环,所以我不确定你在说什么“下一次迭代”。您能否包括完整的异常消息,包括堆栈跟踪?
  • 你是不是不小心写了call_list,而你的意思是calls_list
  • 还有 v_6 而不是 v._6?
  • 由于您没有包含完整的异常/堆栈跟踪,我认为没有任何人可以提供帮助。我在这里看不到任何可能引发您所描述的错误的代码。
  • @aero8991 当你说它显示Name Error: name "call_list + sales_list is not defined时,它实际上显示的是完全相同的东西吗?如果是的话,那就是打字错误,请改正(一定是calls_list)。如果没有,看看它是否显示Name Error: name "calls_list + sales_list is not defined

标签: python pandas if-statement fuzzywuzzy


【解决方案1】:

我想通了。我必须让我的第一个函数返回真/假。

然后我意识到我需要更好地比较不同的字符串,长度太笼统了。相反,我选择使用 Jaro 距离。

我为距离设置了一个条件,然后如果满足该条件,我返回一个值“真”

这大大减少了我的数据!然后我调用了“sales_and_calls_test”函数 我更新了返回值以返回列表,如果它不符合条件则通过(这进一步减少了我的数据!)

这是我的更新:

def sales_and_calls_test(v_sales, v_calls):

  if v_sales > 1:    
    sales_list.append(v_sales)
    return sales_list
  elif  v_calls > 1:     
      calls_list.append(v_calls)
      return calls_list
  else:
    pass

  

for v in match_table.itertuples():
    #print(v)
    if string_len_test(l.Address_1, v.Address_2) == True:
       
       lev_score = lev(l.Address_1, v.Address_2)
       fuzz_score = fuzz.token_sort_ratio(l.Address_1, v.Address_2)
       if  fuzz_score >= 90:
          sales_and_calls_test(v._6, v._7)
          #print(lev_score, fuzz_score)
        else: 
          if fuzz_score == 87: 
            print('close', v.Address, l.Address_2, v._1, v._6, v._7, v._8)
            print(lev_score, fuzz_score)
    
    else:
      continue

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多