2017-06-05 216 views
-2

我试图搜索列表以找到最接近50%的值。我跟踪该值的索引,使用它来查找另一个列表中的中值。我的代码无法正常工作:遍历数列表

def find_median(percent_list, avg_lst): 
 
    closeValueIndex = [] 
 
    count = 0 
 
    med_num = 50 
 
    for i in percent_list: 
 
     diff = abs(percent_list - med_num) 
 
     minDiffValue = min(diff) 
 
     if i == minDiffValue: 
 
      closeValueIndex.append(count) 
 
     count+= 1 
 
    med = avg_lst[count] 
 
    return med 
 

+0

您正在测试的输入是什么,您获得的输出是什么以及预期的输出是什么? – karthikr

+0

欢迎来到StackOverflow。请阅读并遵守帮助文档中的发布准则。 [最小,完整,可验证的示例](http://stackoverflow.com/help/mcve)适用于此处。在发布您的MCVE代码并准确描述问题之前,我们无法为您提供有效的帮助。 我们应该能够将发布的代码粘贴到文本文件中,并重现您描述的问题。 – Prune

回答

0

您应该使用enumerate。它用于同时跟踪列表的索引和元素。

您还可以使用key功能min同时获得所有这些!

def find_median(percent_list, avg_list): 
    count, _ = min(enumerate(percent_list), key=lambda ie: abs(ie[1]-50)) 
    return avg_list[count] 

这固然混淆代码使用lambda(这只是一个匿名函数)以从(index, value)对你送入它拉出值,并选择最小的元素。你可以轻松地写:

def find_median(percent_list, avg_list): 
    min_idx = 0 
    min_diff = abs(percent_list[0] - 50) 
    for i, val in enumerate(percent_list): 
     diff = abs(val - 50) 
     if diff < min_diff: 
      min_idx, min_diff = i, diff 
    return avg_list[min_idx] 

或者只是简单地命名你的匿名函数。

def diff_from_50(tup): 
    _, v = tup # ignore the first element 
    return abs(50 - v) 

i, _ = min(enumerate(percent_list), key=diff_from_50) 
result = avg_list[i] 
1

你混淆了一些自己的概念,而你滥用min。让我们看看代码:

for i in percent_list: 
    diff = abs(percent_list - med_num) 

到目前为止你做得还行; i成为percent_list的每个成员,一次一个。对于每一个这种的,diff是从50的绝对差值然而,下一行是一个逻辑错误:

minDiffValue = min(diff) 

这将不会做任何有用的:diff仅仅是一个单一的值,所以这个必须返回该值。

if i = minDiffValue: 

这是另一个逻辑错误,但在albegra。 i是列表元素; minDiffValue是它距离50的距离。这将是True的唯一方法是值25.这对你的程序没有任何意义。

相反,您需要记住位置的最小元素。尝试合并迭代

for i, value in enumerate(percent_list): 
    diff = abs(percent_list - med_num) 
    if diff < minDiffValue: 
     # Remember the minimum difference and its position 
     minDiffValue = diff 
     minIndex = i 

这样,一旦你完成了循环,你有最小差异其准备使用位置。

return avg_lst[minIndex] 

有更多的“Python化”的方式来做到这一点,但我觉得这个可能是最适合你当前的编程水平。

+0

嗨。谢谢。但是现在怎么会告诉我,minDiffValue是未定义的 –

+0

这不是一个打包好的作业解决方案;我希望你知道如何以及何时初始化一个值。例如,在进入循环之前将其设置为9999。 – Prune