当我输入以下内容时
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]之外,删除此额外{}的最佳方法是什么?是否存在删除这些额外{}会导致问题的情况?
答案 0 :(得分:6)
您可能会意识到这一点,但Position
和Extract
会返回列表,因为请求的值可能位于多个位置。所以一般来说,删除外部括号是没有意义的。
如果您确定结果是单例列表,则使用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]
之前的FullForm
与f
相同),就像{ {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}}