Mathematica 7中列表之间的多个赋值

时间:2009-10-31 07:37:16

标签: wolfram-mathematica

假设有两个列表a = {a1, a2, a3}b = {b1, b2, b3},我想写一个赋值语句来生成a1=b1,a2=b2,a3=b3,它只引用ab

Thread[a = b]

但它只会a={b1,b2,b3}。使用:=(SetDelayed)代替=也不起作用。
有解决方案吗感谢。

4 个答案:

答案 0 :(得分:5)

我认为Thread仅适用于“显式”列表;变量需要在进行操作之前进行扩展。

经过一些实验,这对我有用:

a = {a1, a2, a3};
b = {b1, b2, b3};
Thread[Set[Evaluate@a, Evaluate@b]];
{a1, a2, a3}

你也可以写Thread[Evaluate@a = Evaluate@b];只是取决于你发现哪些更具可读性。

答案 1 :(得分:2)

有什么问题

MapThread [设置,{{A1,A2,A3},{B1,B2,B3}}]

答案 2 :(得分:1)

这是另一种解决方案:

a = {a1, a2, a3};
b = {b1, b2, b3};

each[{x_, y_}, Transpose[{a, b}],
  x = y]

使用我方便的each函数:

SetAttributes[each, HoldAll];                (* each[pattern, list, body]     *)
each[pat_, lst_, bod_] :=                    (*  converts pattern to body for *)
  Scan[Replace[#, pat:>bod]&, Evaluate@lst]  (*   each element of list.       *)

同样,你可以这样做:

MapThread[(#1 = #2)&, {a, b}]

答案 3 :(得分:0)

好吧,如果他们真的被称为a1a2等,你可以这样做:

Assign[x_, y_] := Module[{s1, s2, n, sn},
  s1 = SymbolName[Unevaluated[x]];
  s2 = SymbolName[Unevaluated[y]];

    For[n = 1, n <= Length[x] && n <= Length[y], n++,
      sn = ToString[n];
      Evaluate[Symbol[s1 <> sn]] = Evaluate[Symbol[s2 <> sn]]
    ]
  ]

SetAttributes[Assign, HoldAll]

然后

Clear[b1, b2, b3];
Clear[a1, a2, a3];

a = {a1, a2, a3}
b = {b1, b2, b3}

Assign[a, b]
a

再次为aba提供结果:

{a1, a2, a3}
{b1, b2, b3}
{b1, b2, b3}

正如所料。

通常,您可以通过正确使用SymbolNameSymbol来创建这样的表达式,但请注意您的评估。如果我写了SymbolName[x](没有Unevaluated)那么它会将其解释为SymbolName[{a1, a2, a3}],这显然是不可取的。不在Evaluate上使用Symbol[s1 <> sn]会让Mathematica抱怨您正在尝试重新分配Symbol功能。