遍历列表中的数字

时间:2017-06-05 23:25:57

标签: python python-3.x

我试图搜索列表以找到最接近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  
    




2 个答案:

答案 0 :(得分: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]

还有更多&#34; Pythonic&#34;如何做到这一点,但我认为这个可能最适合您当前的编程水平。

答案 1 :(得分: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]