2008-09-03 12 views
12

मेरे पास मेरे पायथन कोड में एक विधि है जो एक tuple - SQL क्वेरी से एक पंक्ति देता है। मान लें कि यह तीन क्षेत्रों है दो: (jobId, लेबल, उपयोगकर्ता नाम)पाइथन में टुपल्स को विभाजित करना - सर्वोत्तम अभ्यास?

कार्यों के बीच के आसपास इसे पारित करने में आसानी के लिए, मैं एक चर 'काम' नामक के रूप में पूरे टपल गुजर गया है। अंततः, तथापि, मैं बिट्स पर प्राप्त करना चाहते हैं, तो मैं इस तरह कोड का उपयोग किया गया है: (jobId, लेबल, उपयोगकर्ता नाम) = काम

मैंने महसूस किया गया है, हालांकि, कि यह एक बुरा सपना रखरखाव है, क्योंकि अब मैं अपने सभी मौजूदा कोड को तोड़ने के बिना परिणाम सेट में नए फ़ील्ड कभी नहीं जोड़ सकता। मुझे यह कैसे लिखा जाना चाहिए? (jobId, लेबल, उपयोगकर्ता नाम) = (काम [0], काम [1], काम [2]) ... लेकिन यह है कि अच्छी तरह से स्केल नहीं करता है, जब आपके पास:

यहाँ मेरी दो सबसे अच्छा अनुमान कर रहे हैं 15 ... 20 फ़ील्ड

या एसक्यूएल क्वेरी से परिणामों को सीधे एक शब्दकोश में कनवर्ट करने के लिए और इसे पास करने के लिए (मेरे पास इस तथ्य पर नियंत्रण नहीं है कि यह जीवन को ट्यूपल के रूप में शुरू करता है, जो मेरे लिए तय है)

उत्तर

13

मैं कहूंगा कि एक शब्दकोश निश्चित रूप से ऐसा करने का सबसे अच्छा तरीका है। यह आसानी से एक्स्टेंसिबल है, जिससे आप प्रत्येक मान को एक समझदार नाम दे सकते हैं, और पाइथन में शब्दकोशों का उपयोग और कुशलतापूर्वक उपयोग करने के लिए बहुत सी अंतर्निहित भाषा सुविधाएं हैं। यदि आपको बाद में और फ़ील्ड जोड़ने की ज़रूरत है, तो आपको बस इतना बदलना होगा कि वह कोड है जो टुपल को एक शब्दकोश में परिवर्तित करता है और वह कोड जो वास्तव में नए मानों का उपयोग करता है।

उदाहरण के लिए:

job={} 
job['jobid'], job['label'], job['username']=<querycode> 
+0

भी http://code.activestate.com/recipes/81252/ पिन की – Jay

0
एक टपल साथ

करना हमेशा परेशानी फ़ील्ड जोड़ने या बदलने के लिए किया जाएगा। आप सही हैं कि एक शब्दकोश बहुत बेहतर होगा।

यदि आप थोड़ा दोस्ताना वाक्यविन्यास के साथ कुछ चाहते हैं तो आप this question पर एक सरल 'संरचना-जैसी' वस्तु के बारे में जवाब देखना चाहेंगे। इस तरह आप एक वस्तु के आसपास पारित कर सकते हैं, job कहते हैं, और एक टपल या dict से भी अधिक आसानी से अपने क्षेत्रों का उपयोग:

job.jobId, job.username = jobId, username 
3

शायद यह आपके मामले के लिए overkill है, लेकिन मैं एक "नौकरी बनाने के लिए परीक्षा की जाएगी "वर्ग जो ट्यूपल को इसके कन्स्ट्रक्टर तर्क के रूप में लेता है और इसके संबंधित गुण हैं। इसके बाद मैं इसके बजाय इस वर्ग के उदाहरण पास कर दूंगा।

2

मैं एक शब्दकोश का उपयोग करता हूं। आप एक शब्दकोश में इस तरह टपल परिवर्तित कर सकते हैं:

values = <querycode> 
keys = ["jobid", "label", "username"] 
job = dict([[keys[i], values [i]] for i in xrange(len(values))]) 

यह पहली एक सरणी पैदा करेगा [[ "jobid", VAL1], [ "लेबल", val2], [ "उपयोगकर्ता नाम", val3]] और फिर उसे एक शब्दकोश में परिवर्तित करें। यदि परिणाम ऑर्डर या गिनती बदलती है, तो आपको नए नतीजे से मेल खाने के लिए केवल चाबियों की सूची बदलनी होगी।

पीएस अभी भी पायथन पर ताजा है, इसलिए ऐसा करने के बेहतर तरीके हो सकते हैं।

+2

देखें हारून Maenpaa जवाब देखें। पाइथन में एक आम नौसिखिया गलती सूची समझ का उपयोग कर रही है जब ज़िप पर्याप्त होगा। –

-2

कैसे इस बारे में:

class TypedTuple: 
    def __init__(self, fieldlist, items): 
     self.fieldlist = fieldlist 
     self.items = items 
    def __getattr__(self, field): 
     return self.items[self.fieldlist.index(field)] 

फिर आप कर सकता है:

j = TypedTuple(["jobid", "label", "username"], job) 
print j.jobid 

यह बाद में एक शब्दकोश देखने के साथ self.fieldlist.index(field) स्वैप करने के लिए आसान होना चाहिए ...बस अपनी __init__ विधि संपादित करें! स्टाइल की तरह कुछ करता है।

13

@Staale

एक बेहतर तरीका है:

job = dict(zip(keys, values)) 
+0

यह भी बहुत ही बनाए रखने योग्य कोड है, केवल "समस्या" शब्दकोषों से निपटने के लिए कोड का पुनर्निर्माण कर रही है। –

2

एक पुरानी सवाल है, लेकिन जब से कोई भी यह उल्लेख किया मैं अजगर कुकबुक से जोड़ देंगे:

Recipe 81252: Using dtuple for Flexible Query Result Access

यह नुस्खा विशेष रूप से डेटाबेस परिणामों से निपटने के लिए डिज़ाइन किया गया है, और dtuple समाधान आपको नाम या अनुक्रमणिका संख्या के परिणामों तक पहुंचने की अनुमति देता है। यह सबस्क्राइब द्वारा सब कुछ एक्सेस करने से बचाता है जो आपके प्रश्न में उल्लेखनीय है, इसे बनाए रखना बहुत मुश्किल है।

5

यह एक पुरानी सवाल है, लेकिन ...

मैं था इस स्थिति में एक नामित टपल उपयोग करने का सुझाव: collections.namedtuple

यह विशेष रूप से, हिस्सा है कि आप उपयोगी पाते हैं:

सबक्लासिंग नए, संग्रहीत फ़ील्ड जोड़ने के लिए उपयोगी नहीं है। इसके बजाय, _fields विशेषता से बस एक नया नामित टुपल प्रकार बनाएं।

+2

अन्य लाभ: * नामित * दृष्टिकोण एक शब्दकोश की तुलना में कम स्मृति का उपयोग करता है और यह मूल्यों को अद्यतन करने के लिए \ _replace() विधि का समर्थन करता है। –

+0

तकनीकी रूप से, '_replace()' प्रतिस्थापित मूल्यों के साथ एक नया ट्यूपल बनाता है, क्योंकि 'नामांकित' वर्गों के उदाहरण नियमित टुपल्स की तरह अपरिवर्तनीय होते हैं। – JAB

0

यदि आप MySQLdb पैकेज का उपयोग कर रहे हैं, तो आप tuples के बजाय dicts को वापस करने के लिए अपने कर्सर ऑब्जेक्ट्स सेट अप कर सकते हैं।

import MySQLdb, MySQLdb.cursors 
conn = MySQLdb.connect(..., cursorclass=MySQLdb.cursors.DictCursor) 
cur = conn.cursor() # a DictCursor 
cur2 = conn.cursor(cursorclass=MySQLdb.cursors.Cursor) # a "normal" tuple cursor 
संबंधित मुद्दे