为了账号安全,请及时绑定邮箱和手机立即绑定

计算python中两个列表元素之间的差异

计算python中两个列表元素之间的差异

jeck猫 2023-08-22 16:34:34
我想将两个列表的元素相减,并用 python 中干净高效的代码将它们列出来:例如,给定两个列表[2,7,8], [1,9],减去(成对)元素将得到:[1, 7, 6, 2, 7, 1]。我想出了两个代码:代码1:l1,l2 = [1], [3,4]l3,l4 = [2,7,8], [1,9]def computedifference(list1,list2):  output = []  for i in list1:    for j in list2:      output.append(abs(i-j))  return outputprint(computedifference(l1,l2))print(computedifference(l3,l4))代码2:import numpy as np l1,l2 = [1], [3,4]l3,l4 = [2,7,8], [1,9]def computedifference(list1,list2):  output1 = [ np.asarray(list1)-x for x in np.asarray(list2)]  output = [np.abs(x) for x in output1]  return outputprint(computedifference(l1,l2))print(computedifference(l3,l4))   预期产出[2, 3][1, 7, 6, 2, 7, 1]有没有更好的、Pythonic 且有效的方法?
查看完整描述

6 回答

?
长风秋雁

TA贡献1757条经验 获得超7个赞

让我们尝试一下outer

np.abs(np.subtract.outer(l3,l4)).ravel()

输出:

array([1, 7, 6, 2, 7, 1])


查看完整回答
反对 回复 2023-08-22
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

问题

最有效地计算可迭代对象的笛卡尔积并减去结果的 Pythonic 方法。

解决方案

最简单、最Pythonic的方法:

[ abs(i-j) for i,j in itertools.product(list1, list2) ]

根据数据集的大小,您可能需要使用生成器表达式。

( abs(i-j) for i,j in itertools.product(list1, list2) )

请注意,您不需要显式定义 l1 和 l2,因为 itertools.product 采用可n迭代对象。您可以简单地执行以下操作:

l = [[1], [3,4]]

( abs(i-j) for i,j in itertools.product(*l) )
查看完整回答
反对 回复 2023-08-22
?
慕的地6264312

TA贡献1817条经验 获得超6个赞

import itertools

def computedifference(list1,list2):

    return [abs(i-j) for i,j in itertools.product(list1,list2)]

itertools.product 的文档:https://docs.python.org/2/library/itertools.html#itertools.product


查看完整回答
反对 回复 2023-08-22
?
月关宝盒

TA贡献1772条经验 获得超5个赞

您可以使用numpy 广播来向量化成对差异:

import numpy as np

l1, l2 = [1], [3,4]

l3, l4 = [2,7,8], [1,9]


def computedifference(list1, list2):

    l1 = np.array(list1)

    l2 = np.array(list2)

    

    return np.abs(l1[:,None] - l2).ravel().tolist()



computedifference(l1,l2)

[2, 3]


computedifference(l3,l4)

[1, 7, 6, 2, 7, 1]


查看完整回答
反对 回复 2023-08-22
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

你可以使用:


>>> np.abs(a[:, np.newaxis] - b).flatten()

array([1, 7, 6, 2, 7, 1])


查看完整回答
反对 回复 2023-08-22
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

l1 = [2,7,8]

l2 = [1,9]


def computedDiff(list1,list2):

    return([abs(i-j) for i in list1 for j in list2])


print(computedDiff(l1,l2))

        

好吧,基本上我在这里所做的就是将其压缩为一行,并且只是以列表形式返回整个 for 循环。只是一种更干净的方法,因为它不包含任何其他变量或附加到列表。


查看完整回答
反对 回复 2023-08-22
  • 6 回答
  • 0 关注
  • 1451 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信