2008-12-08 8 views
6

मुझे किसी अन्य भाषा में जाने के लिए एक सूची (या एक dict) को अल्पविराम से अलग सूची में परिवर्तित करने की आवश्यकता है।तर्कों की एक अल्पविराम से अलग सूची में डेटा संरचना स्वरूपण

result = '' 
args = ['a', 'b', 'c', 'd'] 

i = 0 
for arg in args: 
    if i != 0: result += arg 
    else:   result += arg + ', ' 
    i += 1 

result = 'function (' + result + ') 

धन्यवाद, दान

+0

यह परिणाम 'फ़ंक्शन (ए, बीसीडी)' में होता है, अगर मुझे – hop

उत्तर

11
'function(%s)' % ', '.join(args) 

पैदा करता

'function(a, b, c, d)' 
+0

+1 concatenation के बजाय प्रारूप करने के लिए +1। –

+0

पायथन 3.0 'फ़ंक्शन ({0})' प्रारूप (','।शामिल हों (args)) – Mapad

12

', '.join(args) चाल करना होगा:

वहाँ से ऐसा करने का एक अच्छा तरीका है।

+2

गलत नहीं किया गया है और यदि तर्क सभी तार नहीं हैं, ',' .join (नक्शा (str, args)) अच्छी तरह से काम करेगा। –

+1

या ',' .join (str (x) x में args के लिए) –

+0

धन्यवाद एस और जेम्स इस स्टैक ओवरफ्लो पोस्ट पर अतिरिक्त टिप्पणी के लिए। यही वह चीज है जिसकी मुझे जरूरत थी। – Chris

0

क्यों एक मानक है कि दोनों भाषाओं पार्स कर सकते हैं, JSON, XML, या YAML की तरह उपयोग नहीं? simplejson आसान है, और जेसन के रूप में पायथन 2.6 में शामिल है।

1
result = 'function (%s)' % ', '.join(map(str,args)) 

मैं सिर्फ आर्ग के बजाय नक्शा (str, args) की सलाह देते हैं, क्योंकि आपके तर्कों के कुछ संभावित नहीं तार हो सकता है और उदाहरण के लिए एक लेखन त्रुटि का कारण होता है, अपनी सूची में किसी पूर्णांक तर्क के साथ:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: sequence item 0: expected string, int found 

जब आप dict वस्तुओं में आते हैं तो आप संभवतया ताना के मूल्यों को अलग-अलग करना चाहते हैं (संभवतः मान जो आप इस फ़ंक्शन में पास करना चाहते हैं)। आप dict वस्तु पर ही विधि में शामिल होने है, तो आप चाबियाँ, अलग इसलिए की तरह मिल जाएगा:

>>> d = {'d':5, 'f':6.0, 'r':"BOB"} 
>>> ','.join(d) 
'r,d,f' 

क्या आप चाहते हैं निम्नलिखित है:

>>> d = {'d':5, 'f':6.0, 'r':"BOB"} 
>>> result = 'function (%s)' % ', '.join(map(str, d.values())) 
>>> result 
'function (BOB, 5, 6.0)' 

नई समस्या आपके सामने आने वाली ध्यान दें, तथापि। जब आप जॉइन फ़ंक्शन के माध्यम से स्ट्रिंग तर्क पास करते हैं, तो यह इसके उद्धरण को खो देता है। तो यदि आप तारों को पारित करने की योजना बना रहे हैं, तो आपने उद्धरण खो दिए हैं जो आम तौर पर किसी फ़ंक्शन में पारित होने पर स्ट्रिंग को घेर लेते हैं (तारों को कई सामान्य-उद्देश्य भाषाओं में उद्धृत किया जाता है)। यदि आप केवल संख्या उत्तीर्ण कर रहे हैं, हालांकि, यह आपके लिए कोई समस्या नहीं है।

शायद मैंने अभी वर्णित समस्या को हल करने का एक अच्छा तरीका है, लेकिन यहां एक विधि है जो आपके लिए काम कर सकती है।

>>> l = list() 
>>> for val in d.values(): 
... try: 
...  v = float(val) #half-decent way of checking if something is an int, float, boolean 
...  l.append(val) #if it was, then append the original type to the list 
... except: 
...  #wasn't a number, assume it's a string and surround with quotes 
...  l.append("\"" + val + "\"") 
... 
>>> result = 'function (%s)' % ', '.join(map(str, l)) 
>>> result 
'function ("BOB", 5, 6.0)' 

अब स्ट्रिंग के आस-पास उद्धरण हैं। यदि आप संख्यात्मक प्राइमेटिव्स और तारों की तुलना में अधिक जटिल प्रकार गुजर रहे हैं तो आपको शायद एक नया प्रश्न चाहिए :)

एक आखिरी नोट: मैं d.values ​​() का उपयोग कर रहा हूं ताकि यह दिखाया जा सके कि शब्दकोश से मूल्यों को कैसे निकाला जाए, लेकिन वास्तव में जो शब्दकोष से मूल्यों को बहुत अधिक मनमाना क्रम में वापस कर देगा। चूंकि आपके फ़ंक्शन को किसी विशेष क्रम में तर्कों की आवश्यकता होती है, इसलिए आपको d.values ​​() को कॉल करने के बजाय मैन्युअल रूप से अपनी मानों की सूची बनाना चाहिए।

+0

यह जांचने का सबसे अच्छा तरीका है कि वैल एक स्ट्रिंग है या नहीं, Python3.0 में केवल इंस्टेंसेंस (वैल, बेसस्ट्रिंग) (या केवल इंस्टेंसेंस (वैल, स्ट्र) है) –

+0

पायथन 2.5.2 में इंस्टॉलेशन है? मैं 2.6 या 3.0 तक अपग्रेड नहीं कर सकता क्योंकि हमारी कंपनी इतने सारे तृतीय-पक्ष पैकेजों पर निर्भर करती है जो केवल 2.5.2 या इससे पहले संकलित होती हैं। इसके अलावा, किसी ने मुझे एक बार कहा था कि इन्सिंस्टेंस का उपयोग करके कुछ भी जांचने के लिए मजबूर हो सकता है भले ही यह नहीं था। क्या यह सच है? –