Python程序查找列表中所有对之间的绝对差之和
给定一个不同元素的列表,编写一个Python程序来查找给定列表中所有对的绝对差之和。
例子:
Input : [9, 2, 14]
Output : 24
Explanation: (abs(9-2) + abs(9-14) + abs(2-14))
Input : [1, 2, 3, 4]
Output : 10
Explanation: (abs(1-2) + abs(1-3) + abs(1-4)
+ abs(2-3) + abs(2-4) + abs(3-4))
第一种方法是蛮力方法,之前已经讨论过。在这里,我们将讨论 Pythonic 方法。
方法 #1:使用 enumerate()
Enumerate() 方法向一个可迭代对象添加一个计数器,并以枚举对象的形式返回它。在这种方法中,我们有一个包含绝对差异的列表“差异”。我们使用两个循环,每个循环有两个变量。一个用于遍历计数器,一个用于列表元素。在每次迭代中,我们检查元素是否相似。如果不是,请找到绝对差异并将其附加到差异中。最后,找到列表的总和。由于每对将被计算两次,因此我们将最终总和除以 2 并返回。
Python3
# Python3 program to find sum of
# absolute differences in all pairs
def sumPairs(lst):
diffs = []
for i, x in enumerate(lst):
for j, y in enumerate(lst):
if i != j:
diffs.append(abs(x-y))
return int(sum(diffs)/2)
# Driver program
lst = [1, 2, 3, 4]
print(sumPairs(lst))
Python3
# Python3 program to find sum of
# absolute differences in all pairs
import itertools
def sumPairs(lst):
diffs = [abs(e[1] - e[0]) for e in itertools.permutations(lst, 2)]
return int(sum(diffs)/2)
# Driver program
lst = [9, 8, 1, 16, 15]
print(sumPairs(lst))
Python3
lst = [2, 4, 1, 3]
# first we sort the array
lst = sorted(lst)
summ = sum(lst) # it is a very important variable to us
result = 0
for d, i in enumerate(lst): # enumerate([6, 7, 8]) = [(0, 6), (1, 7), (2, 8)]
result += summ - (i * (len(lst) - d))
# first index of above will look like this: 10 - 1*4 = 4-1 + 3-1 + 2-1 + 1-1
summ -= i # for instance in the second i we dont want 1-2, so we get rid of it
print(result)
输出
10
方法 #2:使用itertools
Python itertools 由permutation()方法组成。此方法将列表作为输入,并返回包含列表形式中所有排列的元组的对象列表。在这里,要找到绝对差异,我们基本上需要两个元素的排列。由于每对将被计算两次,因此我们将最终总和除以 2。
Python3
# Python3 program to find sum of
# absolute differences in all pairs
import itertools
def sumPairs(lst):
diffs = [abs(e[1] - e[0]) for e in itertools.permutations(lst, 2)]
return int(sum(diffs)/2)
# Driver program
lst = [9, 8, 1, 16, 15]
print(sumPairs(lst))
输出
74
方法#3 :使用排序数组
在这种方法中,我们首先对数组进行排序并跟踪项目列表的总和,并在完成后从中减去工作索引。我们实际上是从数组中大于或等于 i 的项目数的总和中减去 (i *
Python3
lst = [2, 4, 1, 3]
# first we sort the array
lst = sorted(lst)
summ = sum(lst) # it is a very important variable to us
result = 0
for d, i in enumerate(lst): # enumerate([6, 7, 8]) = [(0, 6), (1, 7), (2, 8)]
result += summ - (i * (len(lst) - d))
# first index of above will look like this: 10 - 1*4 = 4-1 + 3-1 + 2-1 + 1-1
summ -= i # for instance in the second i we dont want 1-2, so we get rid of it
print(result)
输出
10