一行中两个列表中int之间的平均差异-Python

一行中两个列表中int之间的平均差异-Python,python,Python,有两个非空列表,仅包含整数,它们的长度相同 我们的函数需要返回相同索引的整数之间的平均绝对差值。 例如,对于列表[1,2,3,4]和[1,1,1,1],答案将是1.5 该功能需要在一行中完成 我有一个小东西可以做到这一点,但正如你可能猜到的,它不是一行: def avg_diff(a, b): sd = 0.0 for x, y in zip(a, b): sd += abs(x - y) return sd / len(a) 谢谢。使用列表中的内置su

有两个非空列表,仅包含整数,它们的长度相同

我们的函数需要返回相同索引的整数之间的平均绝对差值。
例如,对于列表
[1,2,3,4]
[1,1,1,1]
,答案将是
1.5

该功能需要在一行中完成

我有一个小东西可以做到这一点,但正如你可能猜到的,它不是一行:

def avg_diff(a, b):
    sd = 0.0
    for x, y in zip(a, b):
        sd += abs(x - y)
    return sd / len(a)

谢谢。

使用列表中的内置
sum
len
函数:

a = [1, 2, 3, 4]
b = [1, 1, 1, 1]

sum([abs(i - j) for i, j in zip(a,b)]) / float(len(a))
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

使用列表中的内置
sum
len
函数:

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
在Python3.4中,我们在标准库中获得了一些,包括

使用此函数和生成器表达式:

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
在Python3.4中,我们在标准库中获得了一些,包括

使用此函数和生成器表达式:

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

如果您愿意使用第三方库,
numpy
提供了一种方法:

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

如果您愿意使用第三方库,
numpy
提供了一种方法:

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

提示,使用:lambda你喜欢使用第三方库吗(例如
numpy
?)我想你的答案可以在这篇文章中找到:提示,使用:lambda你喜欢使用第三方库吗(例如
numpy
?)我想你的答案可以在这篇文章中找到:你不需要做列表,只需使用一个生成器表达式:
sum(i-j代表i,j在zip(a,b))/len(a)
我知道他使用它的确切原因:)谢谢Shahaf和所有人,我完全忘记了sum的存在。@Guy,这是为什么?因为我不需要。你不需要理解列表,只要使用一个生成器表达式:
sum(I-j代表I,j在zip(a,b))/len(a)
我知道他为什么使用它:)谢谢沙哈夫和所有人,我完全忘记了sum的存在。@Guy,这是为什么?因为我不喜欢。我讨厌统计模块。如果你看一下代码,它非常复杂,并且有一个非常奇怪的要求,即结果的精度等于输入的精度,这是我们在统计学中很少关心的<代码>从统计导入平均值作为统计平均值--定义py_平均值(x):返回和(x)/len(x)--
%timeit统计平均值(x)#137 ms±1.63 ms/循环(平均值±标准偏差7次,每个循环10次)
-
%timeit py_平均值(x)359µs±4.44µs/循环(平均值±标准偏差7次,每个循环1000次)
@FHTMitchell我承认我也没有正常使用它,因为我通常使用
numpy.array
s。我只知道它是存在的,它确实是一个很好的单线解决方案,正如OP所要求的那样。我猜它支持
十进制
分数
的价格是非常复杂的实现,与直接的实现相比,速度要快得多。是的,同样,我只是认为这是stdlib试图包含目前由第三方完成的事情,但不知何故却做得更糟的另一个例子——请参见
attrs
dataclasses
。参考
%timeit np_平均值(x)#2.31 ms±41.3µs/循环(平均值±标准偏差为7次运行,每个循环100次)
,但该列表已传递给它。对于阵列:
%timeit np_平均值(y)#63.1µs±1.57µs每个循环(平均值±标准偏差为7次运行,每个循环10000次)
我讨厌统计模块。如果你看一下代码,它非常复杂,并且有一个非常奇怪的要求,即结果的精度等于输入的精度,这是我们在统计学中很少关心的<代码>从统计导入平均值作为统计平均值--定义py_平均值(x):返回和(x)/len(x)--
%timeit统计平均值(x)#137 ms±1.63 ms/循环(平均值±标准偏差7次,每个循环10次)
-
%timeit py_平均值(x)359µs±4.44µs/循环(平均值±标准偏差7次,每个循环1000次)
@FHTMitchell我承认我也没有正常使用它,因为我通常使用
numpy.array
s。我只知道它是存在的,它确实是一个很好的单线解决方案,正如OP所要求的那样。我猜它支持
十进制
分数
的价格是非常复杂的实现,与直接的实现相比,速度要快得多。是的,同样,我只是认为这是stdlib试图包含目前由第三方完成的事情,但不知何故却做得更糟的另一个例子——请参见
attrs
dataclasses
。参考
%timeit np_平均值(x)#2.31 ms±41.3µs/循环(平均值±标准偏差为7次运行,每个循环100次)
,但该列表已传递给它。对于阵列:
%timeit np#u平均值(y)#63.1µs±1.57µs/循环(平均值±标准偏差为7次运行,每个循环10000次)