Wolfram mathematica 为什么Extract会向结果中添加额外的{},删除它们的最佳方法是什么

Wolfram mathematica 为什么Extract会向结果中添加额外的{},删除它们的最佳方法是什么,wolfram-mathematica,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总是在结果中添加一个额外的{}。除了每次应用展平[result,1]之外,删除这个额外的{}的最佳方法是什么?是否存在删除这些额

当我键入以下内容时

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总是在结果中添加一个额外的{}。除了每次应用展平[result,1]之外,删除这个额外的{}的最佳方法是什么?是否存在删除这些额外的{}会导致问题的情况?

您可能意识到这一点,但是
位置
提取
返回列表,因为请求的值可能位于多个位置。因此,一般来说,移除外部支架没有意义

如果您确定结果是一个单例列表,那么如果元素本身是一个列表,则使用
flatte
将销毁信息。比如说,

Position[{{1}},1]
给出其唯一元素为列表的列表。因此,在这种情况下,使用
提取
更有意义

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

Position[1,1]
Position[{1},1]

这会产生非常不同的结果。因此,是否可以从单成员列表中删除外部大括号取决于您计划如何使用它。

如果我正确理解了您的问题,您会问为什么

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

{{1}}
而不是

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

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

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

{f[1]}
这里的要点是,
{1}
中的
List
(如果你查看
FullForm
,它与
List[1]
相同)之前只是一个头部,就像这里的
f
。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}
).还是我在你的问题中遗漏了什么?

简短回答:你可能应该使用
First@Position[…]

长答覆: 让我们将问题分为两部分:

为什么在
位置的结果中有额外的
{}
? i、 e.原因:

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

这是为了与n维列表保持一致,该列表可能在多个位置具有请求的值。例如:

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

这是结果所在坐标的列表。 因此,在你的情况下:

lis = {1, 2};
Position[lis, 1]
返回
{{1}}
,如:我们在坐标集中
{1}
找到了您请求的值

现在,Mathematica经常假设可能有一个解决方案列表(例如,在
Solve
中),但用户知道他只需要一个。在您的情况下,适用于此的代码是
First@Position[…]
。这将返回位置列表中的第一个(也可以说是唯一的)元素-- 因此,如果您确定要搜索的元素在列表中只存在一次,并且想知道在哪里,请使用这种方式

为什么在
提取
的结果中有额外的
{}
Extract
可以以两种不同的方式工作

如果我在做
提取[{{a,b,c},{d,e,f},{g,e,h},{1,2}]
我将得到
b
,因此使用1维列表的extract只是选择并返回这个元素。事实上,
extract[lis,{1,2}]
等于
lis[[1,2]]

如果我在做
提取[{{a,b,c},{d,e,f},{g,e,h},{{1,2},{3,4}]
我将得到
{b,h}
,因此使用二维列表进行提取就是选择并返回元素列表


在您的例子中,您正在执行
提取[lis,{{1}]
,例如:给我一个只包含元素
lis[[1]]
的列表。结果总是列表中的这个元素,这是额外的
{1}

,您的解决方案有问题。如果我使用First@Position[...]那么它不会一直工作。下面是一个示例:First@Position[{1,2},99]。因此,在使用此方法之前,必须首先检查Position是否没有返回{},这是不好的。但是,即使Position返回{},展平[Position[{1,2},99],1]也会起作用或者不存在。是的。如果元素在代码中只存在并且恰好存在一次,则此技巧有效。我想/希望我已经很好地解释了Mathematica为什么要在结果中添加额外的
{}
。为了说明删除它们的最佳方式,您需要提供更多信息-您尝试做什么(起点和终点是什么)?您是否希望输入中出现“奇怪”的情况(如多于或少于1个找到的元素)?您希望程序如何处理这些情况?