2010-11-20 13 views
15

में मानों की सूची पर फ़ंक्शंस की एक सूची लागू करें क्या ज़िप करने के लिए बेवकूफ और/या सुरुचिपूर्ण पायथन है और मूल्यों की सूची में फ़ंक्शंस की एक सूची लागू कर रहा है?पिन और पाइथन

उदाहरण के लिए, मान लीजिए आप कार्यों की एक सूची है:

functions = [int, unicode, float, lambda x: '~' + x + '~'] 

और मानों की सूची:

values = ['33', '\xc3\xa4', '3.14', 'flange'] 

वहाँ ith मूल्य और वापसी के लिए ith समारोह लागू करने के लिए एक रास्ता है इस बदसूरत सूची समझ से परहेज करते हुए, परिवर्तित मूल्यों की एक ही लंबाई की एक सूची?

[functions[i](values[i]) for i in range(len(functions))] # <- ugly 

क्या मैं चाहता हूँ की तरह zip() + map() (zipmap()!) मूल्यों की सूची के साथ कार्यों सूची कुछ है और कार्यों उनकी बनती मूल्यों को लागू किया जा है। मैंने सोचा कि itertools कुछ प्रासंगिक पेशकश कर सकता है, लेकिन imap और starmap जैसे फ़ंक्शंस एक ही फ़ंक्शन को एक पुनरावर्तनीय पर मैप करने के लिए हैं, किसी अन्य पुनरावर्तनीय पर फ़ंक्शंस का एक पुनरावर्तनीय नहीं है।

+0

मैं कहना है कि काम आप कर रहे हैं इच्छा तरह का बदसूरत ही है, इसलिए एक उम्मीद करनी चाहिए कार्यान्वयन होने के लिए इच्छुक हूँ - के रूप में आप इसका न्याय करते हैं - बदसूरत भी। – msw

+2

@msw मुझे लगता है कि यह कार्य सामान्य है - सीएसवी फ़ाइल या इसी तरह से कच्चे बाइटस्ट्रिंग्स को पाइथन ऑब्जेक्ट्स में बदलने के बारे में सोचें, इसलिए फ़ंक्शंस की सूची कॉलम मैपिंग से आ सकती है जिसमें कॉलम डेटा जैसे अन्य मेटाडेटा होते हैं। –

+1

@msw: अपने सिर को एक औसत डेटाबेस के अंदर चिपकाएं और देखें कि किसी डेटाबेस को बदसूरत कैसे हो सकता है जब किसी को इसे सत्यापित करने के लिए कुछ बदसूरत कोड लिखने पर परेशान न हो। –

उत्तर

16

ये समाधान overly जटिल लग: map पहले से ही अपने तर्कों ज़िप:

map(lambda x,y:x(y), functions, values) 

या, यदि आप इटरेटर संस्करण पसंद करते हैं:

from itertools import imap 
imap(lambda x,y:x(y), functions, values) 
20
[x(y) for x, y in zip(functions, values)] 
+0

ईमानदार होने के लिए, मैं एक गैर-सूची समझ-आधारित समाधान की उम्मीद कर रहा था, इससे कोई फर्क नहीं पड़ता कि कितना सुरुचिपूर्ण है, और आपका निश्चित रूप से है - मैं मानक लाइब्रेरी से एक कार्यात्मक अनुप्रयोग समाधान के लिए बाहर था। लेकिन आपका प्रैक्टिकल, संक्षिप्त, और बदसूरत नहीं है :) –

+0

सही - मुझे लगता है कि मेरा मतलब है, सिंटैक्स के विपरीत एक शुद्ध फ़ंक्शन एप्लिकेशन। लेकिन बिंदु ले लिया :) –

+2

@ पॉल स्मिथ, इस तरह की चीज को मानक पुस्तकालय द्वारा कवर करने की आवश्यकता नहीं है, यह है कि अजगर की सूची समझ है। वे भाषा का एक अभिन्न हिस्सा हैं और जहां उचित हो वहां उपयोग किया जाना चाहिए। वे यहाँ उपयुक्त हैं। – aaronasterling

4

कार्यात्मक encapsulation की खूबसूरत विशेषताओं में से एक है वे कुरूपता छुपा सकते हैं।

आप zipmap जरूरत है, यह निर्धारित करें:

def zipmap(values, functions): 
    return [functions[i](values[i]) for i in range(
     len(functions))] 
1

कोड जो कि मजबूत रूप से कार्य करने के लिए है पाश के लिए एक में यह कर ould इतना है कि यह सार्थक त्रुटि की सूचना प्रदान कर सकता है:

for i in xrange(num_columns): 
    try: 
     outrow.append(functions[i](input_values[i]) 
    except (ValueError, EtcetcError) as e: 
     self.do_error_reporting(row_number, i, input_value[i], e) 
     outrow.append(None) 
संबंधित मुद्दे