为什么Extract会在结果中添加额外的{}以及删除它们的最佳方法

时间:2011-07-20 10:48:11

标签: wolfram-mathematica

当我输入以下内容时

lis = {1, 2};
pos = Position[lis, 1];
result = Extract[lis, pos]

结果始终是一个列表。

{1}

另一个例子

lis = {{1}, {2}};
pos = Position[lis, {1}];
result = Extract[lis, pos]

{{1}}

Mathematica总是在结果中添加额外的{}。除了每次应用Flatten [result,1]之外,删除此额外{}的最佳方法是什么?是否存在删除这些额外{}会导致问题的情况?

3 个答案:

答案 0 :(得分:6)

您可能会意识到这一点,但PositionExtract会返回列表,因为请求的值可能位于多个位置。所以一般来说,删除外部括号是没有意义的。

如果您确定结果是单例列表,则使用Flatten会破坏信息,如果该元素本身是一个列表。例如,

Position[Extract,1]

给出一个列表,其唯一元素是列表。所以在这种情况下,使用Position[1,1] Position[{1},1] 会更有意义。

即便如此,在很多情况下,Mathematica对x的处理方式与x非常不同,如

{{1}}

结果非常不同。因此,您是否可以从一个成员列表中删除外括号取决于您打算如何处理它。

答案 1 :(得分:4)

如果我理解你的问题,你就会问为什么

lis = {{1}, {2}};
pos = Position[lis, {1}];
result = Extract[lis, pos]

返回

{1}

而不是

Position[lis,{1}]

我认为答案很简单:{1}给出1中出现lis而不是Extract的位置;当你然后使用{1}查看该位置时,确实得到1然后将其包装在一个列表中(这正是第一种情况中发生的事情,当你查找{{1}时结果获得{1};只需将1替换为{1},因为这就是您要求的内容。

要更清楚地看到这一点,请尝试

lis = {f[1], f[2]};
pos = Position[lis, f[1]];
result = Extract[lis, pos]

给出了

{f[1]}

这里的要点是List中的{1}(如果您查看List[1]之前的FullFormf相同),就像{ {1}}在这里。 mathematica应该删除f吗?如果没有,那为什么它应该先删除最里面的List

最后,如果你真的想在第二个例子中删除内部{},请尝试

lis = {{1}, {2, {1}}};
pos = Position[lis, {1}];
result = Extract[lis, pos, #[[1]] &]

{1, 1}
编辑:我对这里的一些答案感到困惑。如果我做

lis = {{1}, {2, {1, 2, {1}}}};
pos = Position[lis, 1];
result = Extract[lis, pos]

然后我得到

{1, 1, 1}
result中的

。当我实际获得{1}pos的位置而不是1的位置时,我只得到额外的括号(然后当我查看这些位置时,我发现{{1} })。或者我在你的问题中遗漏了什么?

答案 2 :(得分:2)

简短回答:您可能使用First@Position[...]

答案很长: 让我们把问题分成两部分:

为什么{}的结果中有额外的Position

即。原因如下:

lis = {1, 2};
Position[lis, 1]

返回lis = {{1, 2, 3}, {1, 5, 6}, {1, 2, 1}}; Position[lis, 1]

这是为了与n维列表一致地工作,其可以在多个位置具有所请求的值。例如:

{{1, 1}, {2, 1}, {3, 1}, {3, 3}}

返回lis = {1, 2}; Position[lis, 1]

是找到结果的坐标列表。 所以在你的情况下:

{1}

返回Solve,例如:我们在坐标集First@Position[...]中找到了您要求的值一次。

现在,Mathematica很多时候都认为可能有一个解决方案列表(例如,在{}中),但用户知道他只期望一个。在您的情况下,适合的代码将是Extract。这将返回位置列表中的第一个(也可能是唯一的)元素 - 因此,如果您确定要搜索的元素在列表中只存在一次并想知道在哪里,请使用这种方式。

为什么Extract的结果中有额外的Extract[{{a, b, c}, {d, e, f}, {g, e, h}}, {1, 2}]

b可以通过两种不同的方式工作。

如果我正在做Extract[lis, {1, 2}] 我将获得lis[[1, 2]],因此使用1维列表提取只是选择并返回此元素。实际上,Extract[{{a, b, c}, {d, e, f}, {g, e, h}}, {{1, 2}, {3, 4}}]等于{b, h}

如果我正在做Extract[lis, lis[[1]]] 我将获得{},因此使用2维列表进行提取是选择并返回元素列表。

在您的情况下,您正在执行{{1}},例如:给我一个仅包含元素{{1}}的列表。结果始终是列表中的此元素,即额外的{{1}}