如果我有一个嵌套列表,例如x = [[1, 2, 3], [2, 4, 6], [3, 5, 7]],如何计算它们之间的差异?让我们在x - A, B, and C中调用列表。我想计算A和B& C,B从A& C,然后C从A& B,然后把它们放在一个列表diff = []中。,我的问题是对数字进行正确的索引,并使用它们对其他列表中的相应元素进行数学计算。
for i in range(len(x)):
diff = []
for j in range(len(x)):
if x[i]!=x[j]:
a = x[i]
b = x[j]
for h in range(len(a)):
d = a[h] - b[h]
diff.append(d)本质上,对于A到B的差异,它是([1-2] + [2-4] + [3-6]),我希望它返回:diff = [[diff(A,B), diff(A,C)], [diff(B,A), diff(B,C)], [diff(C,A), diff(C,B)]]与正确的点之间的差异。
提前感谢!
发布于 2021-09-14 01:22:23
你的解决方案其实并不遥远。正如Aniketh所提到的,一个问题是您对x[i] != x[j]的使用。因为x[i]和x[j]是数组,这实际上总是计算为false。
原因是python在默认情况下不会对数组进行有用的比较。它只需检查数组引用是否相同。这显然不是您想要的,您正在尝试查看数组在x中是否处于相同的索引位置。为此,请使用i !=j。
虽然这里还有其他的解决方案,但我会在下面添加我的解决方案,因为我已经写好了。它利用python的列表理解。
def pairwise_diff(x):
diff = []
for i in range(len(x)):
A = x[i]
for j in range(len(x)):
if i != j:
B = x[j]
assert len(A) == len(B)
item_diff = [A[i] - B[i] for i in range(len(A))]
diff.append(sum(item_diff))
# Take the answers and group them into arrays of length 2
return [diff[i : i + 2] for i in range(0, len(diff), 2)]
x = [[1, 2, 3], [2, 4, 6], [3, 5, 7]]
print(pairwise_diff(x))发布于 2021-09-14 01:36:06
这是其中一个问题,了解一下Python的标准库- especially 迭代工具确实很有帮助。
例如,要获取要操作的列表对,可以使用itertools.permutations
x = [[1, 2, 3], [2, 4, 6], [3, 5, 7]]
list(permutations(x, r=2))这给出了您想要的一对列表:
[([1, 2, 3], [2, 4, 6]),
([1, 2, 3], [3, 5, 7]),
([2, 4, 6], [1, 2, 3]),
([2, 4, 6], [3, 5, 7]),
([3, 5, 7], [1, 2, 3]),
([3, 5, 7], [2, 4, 6])]现在,如果您可以按每对中的第一对将它们分组.itertools.groupby就是这样做的。
x = [[1, 2, 3], [2, 4, 6], [3, 5, 7]]
list(list(g) for k, g in groupby(permutations(x, r=2), key=lambda p: p[0]))生成按第一个列表分组的列表:
[[([1, 2, 3], [2, 4, 6]), ([1, 2, 3], [3, 5, 7])],
[([2, 4, 6], [1, 2, 3]), ([2, 4, 6], [3, 5, 7])],
[([3, 5, 7], [1, 2, 3]), ([3, 5, 7], [2, 4, 6])]]将所有这些放在一起,您可以创建一个简单的函数,根据您想要的方式减去列表,并传递给每一对:
from itertools import permutations, groupby
def sum_diff(pairs):
return [sum(p - q for p, q in zip(*pair)) for pair in pairs]
x = [[1, 2, 3], [2, 4, 6], [3, 5, 7]]
# call sum_diff for each group of pairs
result = [sum_diff(g) for k, g in groupby(permutations(x, r=2), key=lambda p: p[0])]
# [[-6, -9], [6, -3], [9, 3]]这将问题减少到几行代码,并将在大列表上执行。而且,既然您提到了保持索引正常的困难,请注意,除了选择第一个用于分组的元素之外,在代码中没有使用任何索引。
发布于 2021-09-14 01:05:00
这是我相信你要找的密码。我会在以下解释:
def diff(a, b):
total = 0
for i in range(len(a)):
total += a[i] - b[i]
return total
x = [[1, 2, 3], [2, 4, 6], [3, 5, 7]]
differences = []
for i in range(len(x)):
soloDiff = []
for j in range(len(x)):
if i != j:
soloDiff.append(diff(x[i],x[j]))
differences.append(soloDiff)
print(differences)输出:
[[-6, -9], [6, -3], [9, 3]]首先,在您对算法的解释中,您非常清楚地表明,您应该使用一个函数来计算两个列表之间的差异,因为您将重复使用它。
您的for循环开头很好,但是您应该有第二个列表来追加diff 3次。此外,在检查重复时,需要确保i != j,而不是x[i] != x[j]
如果你还有其他问题,请告诉我!!
https://stackoverflow.com/questions/69170617
复制相似问题