我想要做的是以某种方式映射两个二维数组。我有两对对应的数组:
x1=[1,2,3,4,5]
y1=[7,9,10,17,4]
x2=[3,4,5,6,7]
y2=[5,4,1,13,12]我想让我的程序做的是:
步骤1.比较x1和x2并查找匹配元素
[3,4,5]步骤2.对于那些匹配的元素,执行匹配y元素的减法:
[y1(x)-y2(x)]=[y1(3)-y2(3), y1(4)-y2(4), y1(5)-y2(5)]
它与[10-5, 17-4, 4-1]=[5,13,3]相同:
步骤3.返回另外两个数组,这两个数组包含x1、y1、x2、y2中未使用的元素和减法操作后的元素。预期结果:
x = [1,2,3,4,5,6,7] y = [7,9,5,13,3,13,12]
有没有一种简单的方法来做这样的事情,比如使用map()?这些都是独立的数组。
发布于 2020-04-13 03:06:57
运算符要获取两个列表之间的公共元素,请使用set
&x_common_vals = set(x1) & set(x2) print(x_common_vals) #{3,4,5}
x1和x2中获取每个值的索引,并在y1和y2中获取该索引处的值,如y1[x1.index(value)]3
= y_sub (map(lambda v: y1x1.index(v) - y2x2.index(v),x_common_vals)) print(y_sub) # 5,13,list
发布于 2020-04-13 03:31:39
print( [ y1[x1.index(elt)]-y2[x2.index(elt)] for elt in x1 if elt in x2 ] )

获取所有密钥,但效率不是很高
[ y1[x1.index(elt)]-y2[x2.index(elt)] if elt in x2 else y1[x1.index(elt)] for elt in x1 ]+[ y2[x2.index(elt)] for elt in x2 if elt not in x1 ]

这两个部分的另一种方法是使用字典来提高效率
d1 = {x:y for x,y in zip(x1,y1)}
d2 = {x:y for x,y in zip(x2,y2)}
d = d2.copy()
d = { k:(d1[k]-v if k in d1 else v) for k,v in d.items() }
res = d1.copy()
res.update(d)
X, Y = list(res.keys()), list(res.values())
print(X, Y, sep="\n")

如果你有很大的数据,那就使用pandas数据帧
import pandas as pd
df1 = pd.DataFrame({"k":x1, "v1":y1}).set_index("k")
df2 = pd.DataFrame({"k":x2, "v2":y2}).set_index("k")
def f(row):
a, b = row[0], row[1]
if a and b:
return a - b
elif a:
return a
else:
return b
df = df1.join(other=df2, how="outer").fillna('')
df = pd.DataFrame({"v":df.apply(f, axis=1)} )
print(df)

https://stackoverflow.com/questions/61176629
复制相似问题