2015-01-30 11 views
12

R, get(s) işlevi, s karakter değişkeni (vektör) içinde kayıtlı olan sembolün değerini alır.python karşılığı get() in R (= sembol değerini almak için))

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

Romen rakamıyla r ilk sembolünü alır ve onun tamsayı eşdeğer çevirir.

R-Python sözlükleriyle uğraşırken ve "meta programla", "dilde programlama", "sembol", "dize" vb. Çeşitli kombinasyonlarını gözden geçirirken bir şeye rastlamadım. (Ben çok deneyimli bir R kullanıcısı ve acemi bir Python kullanıcısıyım.)

(Yukarıdaki örnekteki problemi çözmek için çok (çok) kötü bir yol olduğunu biliyorum. Bu sorunun genel cevabı ile ilgileniyorum. değil özellikle tamsayılar için Roma rakamlarını dönüştürülmesinde ...)

+0

Sadece bildiğiniz gibi, eğer Romen rakamlarının dönüşümünü yapacak olsaydınız, muhtemelen bir sözlük sahibi olmanızın en iyisi olacaktır r = {'M': 1000, 'D': 500, 'C': 100 , 'L': 50, 'X': 10, 'V': 5, 'I': 1} 've sadece' r ['X'] '. – mbomb007

+0

evet, bunu biliyordum ... teşekkürler. (Her ne kadar değer sıralamasında yinelemeyi sağlayabilmek için bir sözlükte * sıralı bir * analog olması da yararlı olacaktır ...) –

+0

Bunu neden yapmak istiyorsunuz? Genellikle daha iyi yollar vardır ... :) – ikdc

cevap

13

Sen locals kullanabilirsiniz:

s = 1 
locals()['s'] 

DÜZENLEME:

Aslında R get daha çok yönlüdür - get('as.list') size 01 geri verecek. Sınıf üyeleri için Python'da getattr (here) ve len, getattr(__builtins__, 'len') gibi yerleşik şeyler için kullanılabilir.

+0

Bu, eval() 'den çok daha iyidir. – L3viathan

+2

@ L3viathan: Nedenini açıklayabilir misin? –

+6

'eval', verdiğiniz kodu değerlendirecek ve uygulayacaktır. Sizin durumunuzda bir fark yaratamayabilirsiniz, ama genel olarak tehlikeli olabilir (doğrulanmamış/temiz olmayan girdilerle), hemen hemen her zaman kaçınılmalıdır. 'locals()' sadece istediğiniz yerel değişkenlerin bir sözlüğünü döndürür. – L3viathan

4

Bir dizeyi ifade olarak değerlendiren eval işlevini kullanın.

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

Önemli not: eval() bir ifadesi değil, sadece değişkenler kullanılabilir herhangi bir kod değerlendirir. Güvenlik açığı riskini artırabilecek doğrudan kullanıcı girdisi ile birlikte kullanmayın.

+1

Bu çalışmayı biliyorum, ama bunu yapmanın "doğru" yolu değil. 'eval' potansiyel olarak tehlikeli ve neredeyse her zaman kaçınılmalıdır. – L3viathan

+0

@ L3viathan Genel bir çözüm istediğini söyledi. Bu, kullanıcı girdisini alması anlamına gelmez. Bu bir çözüm. – mbomb007

+0

Bir "sembolün" değerini almak için genel bir çözüm. 'Yerliler()' bunu (veya globals için globals() ') yapar. – L3viathan