python equivalent of get() in R (= use string to retrieve value of symbol)
在r中,get(s)函数检索名称存储在字符变量(矢量)s中的符号的值,例如
1 2 3 4
| X <- 10
r <-"XVI"
s <- substr(r,1,1) ##"X"
get(s) ## 10 |
取罗马数字r的第一个符号,并将其转换为等价的整数。
尽管花了一段时间浏览R-python字典,搜索"元编程"、"语言编程"、"符号"、"字符串"等各种组合,我还是没有想出任何办法。(我是一个经验丰富的R用户和一个新手python用户。)
(我知道上面的例子是a(非常!)解决问题的方法很差。我对这个问题的一般答案很感兴趣,而不是专门把罗马数字转换成整数……)
- 正如你所知道的,如果你要转换罗马数字,最好是有一本字典r={'M':1000,'D':500,'C':100,'L':50,'X':10,'V':5,'I':1},并且只使用r['X']。
- 是的,我知道…谢谢。(尽管有一个类似于字典的有序结构也很有用,以确保按值顺序迭代…)
- 你为什么要这样做?通常有更好的方法…:)
- 按顺序排列的字典/迭代的有序模拟,还是引用问题的原始符号?
您可以使用locals:
编辑:
实际上,R中的get更通用——get('as.list')会把as.list还给你。对于类成员,在python中,我们可以使用getattr(这里),对于像len这样的内置内容,getattr(__builtins__, 'len')工作。
- 这比eval()好得多。
- @L3Viathan:你能解释为什么吗?
- eval将评估并执行您提供的任何代码。在您的情况下,这可能不会有什么不同,但一般来说,这是危险的(对于未验证/未清理的输入),应该几乎总是避免。locals()只返回一个局部变量字典,这是您想要的。
- 在回归的情况下,formula = y~ eval(s)产生了期望的结果,而formula = y~ locals()['s']不产生,有什么原因吗?
使用eval函数,该函数将字符串计算为表达式。
1 2 3
| X = 10
r ="XVI"
v = eval(r[0]) |
号
重要提示:eval()计算表达式中可以使用的任何代码,而不仅仅是变量。不要将其与用户输入直接结合使用,否则可能存在安全漏洞。
- 我知道这是可行的,但这不是"正确"的方法。eval具有潜在的危险性,应尽量避免。
- @他说他需要一个普遍的解决办法。这并不一定意味着他接受用户输入。这是一个解决方案。
- 获取"符号"值的一般解决方案。locals()将这样做(或globals()对全球)。
- 我理解/同意locals()更好的论点。这对我来说仍然是一个有用的答案,所以我赞成(但可能会接受locals()的答案)。
- @Benbolker,但是如果你需要接受像"2*2+(4*3)"之类的用户输入,那么很难用locals()来做,但是,它很适合你的罗马数字例子。在将数学表达式作为用户输入的情况下,我可能会尝试在评估之前用正则表达式验证…