【发布时间】:2011-12-20 18:23:13
【问题描述】:
我经常有一个配对列表,如
data = {{0,0.0},{1,12.4},{2,14.6},{3,25.1}}
我想对所有第二个元素做一些事情,例如Rescale,而不触及第一个元素。我知道的最简洁的方法是:
Transpose[MapAt[Rescale, Transpose[data], 2]]
必须有一种方法可以做到这一点,而无需太多Transposeing。我希望这样的事情能够奏效:
MapAt[Rescale, data, {All, 2}]
但我的理解是MapAt 采用Position-style 规范而不是Part-style 规范。什么是正确的解决方案?
澄清一下,
我正在寻找一个我不必重复自己的解决方案,所以缺少双 Transpose 或双 [[All,2]],因为我认为重复是一个信号,我没有做某事最简单的方法。但是,如果消除重复需要引入中间变量或命名函数或其他额外的复杂性,那么转置/非转置解决方案可能已经是正确的。
【问题讨论】:
-
请注意
[[All,2]]的字符数与Transpose相同。到目前为止,解决方案很有趣,但我认为没有一个比双转置更短,特别是如果您允许使用 esc-tr-esc 快捷方式。也许我应该把这个问题作为一个代码高尔夫挑战提出来? -
如果您想要一个更短的解决方案,您可能应该特别要求它。不同的人会认为不同的东西是(正确的或最优雅的或最容易理解的)解决方案。
-
好吧,如果您根本不想要双倍
Transpose或双倍[[All,2]],我给出的两个答案似乎都很合适:)(不过,我会选择 Mr.W,它更容易阅读如果不写) -
为什么你是首先形成的数据,{{_Integer,_Real},..} 性能明智 {{__Integer},{__Real}} 哪里更好,然后你就不会有问题开始。
-
谢谢大家的回答。做这些事情并不总是一种超级紧凑的方式。这些解决方案展示了在紧凑性和多功能性之间寻求平衡时可能的多样性。