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个找到的元素)?您希望程序如何处理这些情况?