📜  Python程序查找列表中所有对之间的绝对差之和

📅  最后修改于: 2022-05-13 01:55:38.777000             🧑  作者: Mango

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