是否有一个预先固定的操作需要两个列表,比如说
a = { 1, 2, 3 }
b = { 2, 4, 8 }
并在不使用for循环的情况下生成一个新列表,其中每对列表中的相应元素已成倍增加
{ a[1] b[1], a[2] b[2], a[3] b[3] }
我在想可能存在像Inner [Times,a,b,Plus]这样的东西,但是返回一个列表而不是一个总和。
答案 0 :(得分:10)
a = {1, 2, 3}
b = {2, 4, 8}
Thread[Times[a, b]]
或者,由于Times[]
在列表上按元素划分,只需:
a b
请注意两种解决方案的效率并不相同:
i = RandomInteger[ 10, {5 10^7} ];
{First[ Timing [i i]], First[ Timing[ Thread[ Times [i,i]]]]}
(*
-> {0.422, 1.235}
*)
修改强>
Times[]
的行为归因于Listable
属性。看看这个:
SetAttributes[f,Listable];
f[{1,2,3},{3,4,5}]
(*
-> {f[1,3],f[2,4],f[3,5]}
*)
答案 1 :(得分:8)
您可以使用Inner
作为最后一个参数使用List
执行此操作:
In[5]:= Inner[Times, a, b, List]
Out[5]= {2, 8, 24}
但正如其他人已经提到的那样,Times
会自动生效。通常对于像Inner
这样的东西,使用“虚拟”函数测试事物通常很有用,看看结构是什么:
In[7]:= Inner[f, a, b, g]
Out[7]= g[f[1, 2], f[2, 4], f[3, 8]]
然后从那里开始工作,以确定实际功能应该是什么,以提供所需的结果。