首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python -使用嵌套列表进行数学计算

Python -使用嵌套列表进行数学计算
EN

Stack Overflow用户
提问于 2021-09-14 00:55:02
回答 4查看 161关注 0票数 4

如果我有一个嵌套列表,例如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 = []中。,我的问题是对数字进行正确的索引,并使用它们对其他列表中的相应元素进行数学计算。

代码语言:javascript
复制
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)]]与正确的点之间的差异。

提前感谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-09-14 01:22:23

你的解决方案其实并不遥远。正如Aniketh所提到的,一个问题是您对x[i] != x[j]的使用。因为x[i]x[j]是数组,这实际上总是计算为false。

原因是python在默认情况下不会对数组进行有用的比较。它只需检查数组引用是否相同。这显然不是您想要的,您正在尝试查看数组在x中是否处于相同的索引位置。为此,请使用i !=j

虽然这里还有其他的解决方案,但我会在下面添加我的解决方案,因为我已经写好了。它利用python的列表理解。

代码语言:javascript
复制
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))
票数 2
EN

Stack Overflow用户

发布于 2021-09-14 01:36:06

这是其中一个问题,了解一下Python的标准库- especially 迭代工具确实很有帮助。

例如,要获取要操作的列表对,可以使用itertools.permutations

代码语言:javascript
复制
x = [[1, 2, 3], [2, 4, 6], [3, 5, 7]]
list(permutations(x, r=2))

这给出了您想要的一对列表:

代码语言:javascript
复制
[([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就是这样做的。

代码语言:javascript
复制
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]))

生成按第一个列表分组的列表:

代码语言:javascript
复制
[[([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])]]

将所有这些放在一起,您可以创建一个简单的函数,根据您想要的方式减去列表,并传递给每一对:

代码语言:javascript
复制
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]]

这将问题减少到几行代码,并将在大列表上执行。而且,既然您提到了保持索引正常的困难,请注意,除了选择第一个用于分组的元素之外,在代码中没有使用任何索引。

票数 2
EN

Stack Overflow用户

发布于 2021-09-14 01:05:00

这是我相信你要找的密码。我会在以下解释:

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
[[-6, -9], [6, -3], [9, 3]]

首先,在您对算法的解释中,您非常清楚地表明,您应该使用一个函数来计算两个列表之间的差异,因为您将重复使用它。

您的for循环开头很好,但是您应该有第二个列表来追加diff 3次。此外,在检查重复时,需要确保i != j,而不是x[i] != x[j]

如果你还有其他问题,请告诉我!!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69170617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档