【问题标题】:python equivalent of get() in R (= use string to retrieve value of symbol)R 中 get() 的 python 等效项(= 使用字符串检索符号的值)
【发布时间】:2015-01-30 22:20:17
【问题描述】:

在 R 中,get(s) 函数检索其名称存储在字符变量(向量)s 中的符号的值,例如

X <- 10
r <- "XVI"
s <- substr(r,1,1) ## "X"
get(s)             ## 10

获取罗马数字r 的第一个符号并将其转换为等效整数。

尽管花了一些时间翻阅 R-Python 字典并在谷歌上搜索“元编程”、“语言编程”、“符号”、“字符串”等各种组合,但我什么也没想到。 (我是一个非常有经验的 R 用户和一个新手 Python 用户。)

(我知道上面的例子是一个(非常!)糟糕的解决问题的方法。我对这个问题的一般答案感兴趣,而不是专门将罗马数字转换为整数......)

【问题讨论】:

  • 请注意,如果您要进行罗马数字的转换,最好有一本字典 r={'M':1000,'D':500,'C':100,'L':50,'X':10,'V':5,'I':1},然后只使用 r['X']
  • 是的,我确实知道...谢谢。 (尽管有一个字典的 ordered 类似物也很有用,以便能够确保按值顺序进行迭代......)
  • 为什么要这样做?通常有更好的方法... :)
  • 按顺序排列的字典/迭代的类似物,还是原始符号引用问题?

标签: python r


【解决方案1】:

你可以使用locals:

s = 1
locals()['s']

编辑:

实际上,R 中的 get 更加通用 - get('as.list') 将返回 as.list。对于类成员,在 Python 中,我们可以使用 getattr (here),而对于像 lengetattr(__builtins__, 'len') 这样的内置内容也可以使用。

【讨论】:

  • 这比eval()好多了。
  • @L3viathan:你能解释一下原因吗?
  • eval 将评估并执行您提供的任何代码。在您的情况下,这可能没有什么不同,但通常它可能是危险的(使用未经验证/未清理的输入),几乎总是应该避免它。 locals() 只是返回一个局部变量字典,这就是你想要的。
  • 在回归的情况下,formula = y~ eval(s) 产生了预期的结果,而 formula = y~ locals()['s'] 没有,知道为什么吗?
【解决方案2】:

使用eval 函数,它将字符串计算为表达式。

X = 10
r = "XVI"
v = eval(r[0])

重要提示:eval() 评估可在表达式中使用的任何代码,而不仅仅是变量。不要将它与用户输入直接结合使用,这可能会导致安全漏洞。

【讨论】:

  • 我知道这行得通,但这不是“正确”的做法。 eval 具有潜在危险,几乎应始终避免。
  • @L3viathan 他说他想要一个通用的解决方案。这并不一定意味着他正在接受用户输入。这是一种解决方案。
  • 获取“符号”值的通用解决方案。 locals() 会这样做(或 globals() 用于全局)。
  • 我理解/同意locals() 更好的说法。这对我来说仍然是一个有用的答案,所以我赞成它(但可能会接受locals() 答案)。
  • @BenBolker,但是如果您需要接受"2*2+(4*3)" 之类的用户输入,那么使用locals() 会更难,但是是的,这对您的罗马数字示例很有用。在将数学表达式作为用户输入的情况下,我可能会尝试在 eval 之前使用正则表达式进行验证...
猜你喜欢
  • 2018-04-12
  • 2014-10-02
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多