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