Average difference between ints in two lists in one line - Python
有两个非空列表,只包含int,它们的长度相同。
我们的函数需要返回相同索引的整数之间的平均绝对差。例如,对于列表[1, 2, 3, 4]和[1, 1, 1, 1],答案将是1.5。该功能需要在一行中完成。
我有一点可以做到这一点,但正如你可能猜到的,这不是一句话:
1 2 3 4 5
| def avg_diff(a, b):
sd = 0.0
for x, y in zip(a, b):
sd += abs(x - y)
return sd / len(a) |
谢谢。
- 提示,使用:lambda
- 您是否愿意使用第三方库(如numpy)
- 我想你的答案可以在这篇文章中找到:stackoverflow.com/questions/4362586/…
在python 3.4中,我们在标准库中得到了一些统计函数,包括statistics.mean。
使用此函数和生成器表达式:
1 2 3 4 5 6 7
| from statistics import mean
a = [1, 2, 3, 4]
b = [1, 1, 1, 1]
mean(abs(x - y) for x, y in zip(a, b))
# 1.5 |
- 我讨厌统计模块。如果你看代码,它是非常复杂的,并且有一个非常奇怪的要求,即结果的精度等于输入的精度,这是我们在统计中很少关心的。from statistics import mean as stats_mean—def py_mean(x): return sum(x) / len(x)—%timeit stats_mean(x) # 137 ms ± 1.63 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)—%timeit py_mean(x) # 359 µs ± 4.44 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)。
- @fhtmitchell我也承认不经常使用它,因为我通常使用numpy.arrays。我只是知道它存在,而且它确实可以提供一个很好的单行解决方案,正如op所要求的。我猜它的价格也支持Decimal和Fraction,与直接的战争相比,它的实现和速度有点疯狂复杂d实施。
- 是的,同样的,我只是认为这是另一个stdlib的例子,它试图包括目前由第三方完成的事情,但不知何故却设法做到了更糟的事情——见attrs和dataclasses。供参考%timeit np_mean(x) # 2.31 ms ± 41.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each),但有一个列表传递给它。对于数组:%timeit np_mean(y) # 63.1 µs ± 1.57 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)。
1 2 3 4
| a = [1, 2, 3, 4]
b = [1, 1, 1, 1]
sum([abs(i - j) for i, j in zip(a,b)]) / float(len(a)) |
- 你不需要理解列表,只需要使用一个生成器表达式:sum(i - j for i, j in zip(a, b)) / len(a)。
- 我知道他为什么要用它。)谢谢沙哈夫和所有人,我完全忘记了和的存在。
- @伙计,为什么?因为我没有。
如果您愿意使用第三方库,numpy提供了一种方法:
1 2 3 4 5 6 7
| import numpy as np
A = np.array([1, 2, 3, 4])
B = np.array([1, 1, 1, 1])
res = np.mean(np.abs(A - B))
# 1.5 |
使用列表中内置的sum和len功能:
1 2 3 4 5
| lst1 = [1, 2, 3, 4]
lst2 = [1, 1, 1, 1]
diff = [abs(x-y) for x, y in zip(lst1, lst2)] # find index-wise differences
print(sum(diff)/len(diff)) # divide sum of differences by total
# 1.5 |