2015-01-30 4 views
12

आर में, get(s) फ़ंक्शन उस प्रतीक के मान को पुनर्प्राप्त करता है जिसका नाम वर्ण चर (वेक्टर) s में संग्रहीत है, उदा।आर (= प्रतीक में मूल्य प्राप्त करने के लिए स्ट्रिंग का उपयोग करें) के पाइथन समकक्ष (

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

रोमन अंक r के पहले प्रतीक लेता है और अपने पूर्णांक बराबर करने के लिए यह अनुवाद करता है।

आर-पायथन शब्दकोशों के माध्यम से कुछ समय बिताते हुए और "मेटाप्रोग्रामिंग", "भाषा पर प्रोग्रामिंग", "प्रतीक", "स्ट्रिंग" आदि के विभिन्न संयोजनों को गुगल करने के बावजूद, मैं कुछ भी नहीं आया हूं। (मैं एक बहुत अनुभवी आर उपयोगकर्ता और एक नौसिखिया पायथन उपयोगकर्ता हूं।)

(मुझे पता है कि उपर्युक्त उदाहरण समस्या का समाधान करने के लिए एक बहुत ही खराब तरीका है। मुझे इस प्रश्न के सामान्य उत्तर में रूचि है, विशेष रूप से नहीं पूर्णांकों के लिए रोमन अंकों परिवर्तित करने में ...)

+0

बस इतना ही पता है, अगर आप रोमन अंकों के रूपांतरण करने जा रहे थे, तो संभवतः आप एक शब्दकोश 'आर = {' एम ': 1000,' डी ': 500,' सी ': 100 होने से सबसे अच्छा होगा। , 'एल': 50, 'एक्स': 10, 'वी': 5, 'मैं': 1} ', और बस 'आर [' एक्स ']' का उपयोग कर रहा हूं। – mbomb007

+0

हाँ, मुझे पता था कि ... धन्यवाद। (हालांकि यह एक आदेश के * ऑर्डर * एनालॉग के लिए भी उपयोगी होगा ताकि मूल्य क्रम में पुनरावृत्ति सुनिश्चित किया जा सके ...) –

+0

आप ऐसा क्यों करना चाहते हैं? आमतौर पर बेहतर तरीके होते हैं ... :) – ikdc

उत्तर

13

आप locals उपयोग कर सकते हैं:

s = 1 
locals()['s'] 

संपादित करें:

वास्तव में, आर में get अधिक बहुमुखी है - get('as.list') तुम वापस दे देंगे as.list। कक्षा के सदस्यों के लिए, पायथन में, हम getattr (here) का उपयोग कर सकते हैं, और अंतर्निहित चीजों जैसे len, getattr(__builtins__, 'len') काम करता है।

+0

यह 'eval()' से काफी बेहतर है। – L3viathan

+2

@ एल 3viathan: क्या आप समझा सकते हैं क्यों? –

+6

'eval' आपके द्वारा दिए गए किसी भी कोड का मूल्यांकन और निष्पादन करेगा। आपके मामले में जो कोई फर्क नहीं पड़ता है, लेकिन आम तौर पर यह खतरनाक हो सकता है (असत्यापित/अशुद्ध इनपुट के साथ), इसे लगभग हमेशा से बचा जाना चाहिए। 'स्थानीय()' स्थानीय चर के एक शब्दकोश को वापस देता है, जो आप चाहते हैं। – L3viathan

4

eval फ़ंक्शन का उपयोग करें, जो एक स्ट्रिंग को अभिव्यक्ति के रूप में मूल्यांकन करता है।

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

महत्वपूर्ण नोट: eval() किसी भी कोड है कि एक अभिव्यक्ति ही नहीं, चर में इस्तेमाल किया जा सकता का मूल्यांकन करता है। उपयोगकर्ता इनपुट के साथ सीधे इसका उपयोग न करें, जो सुरक्षा भेद्यता को खतरे में डाल सकता है।

+1

मुझे यह काम पता है, लेकिन यह करने के लिए यह "सही" तरीका नहीं है। 'eval' संभावित रूप से खतरनाक है और लगभग हमेशा से बचा जाना चाहिए। – L3viathan

+0

@ एल 3viathan उन्होंने कहा कि वह एक सामान्य समाधान चाहता है। इसका मतलब यह नहीं है कि वह उपयोगकर्ता इनपुट ले रहा है। यह एक समाधान है। – mbomb007

+0

"प्रतीक" के मान प्राप्त करने के लिए एक सामान्य समाधान। 'स्थानीय()' वह करेंगे (या ग्लोबल्स के लिए 'ग्लोबल्स() ')। – L3viathan

संबंधित मुद्दे