2014-06-25 4 views
19

पायथन में प्रोग्रामिंग करते समय, अब मैं सूची समझों का उपयोग करके map, lambda और filter से बचता हूं क्योंकि इसे निष्पादन में पढ़ने और तेज़ करना आसान है। लेकिन reduce भी प्रतिस्थापित किया जा सकता है?पायथन: नक्शा, लैम्ब्डा और फिल्टर जैसी सूची समझ में अनुवाद किया जा सकता है?

उदा। किसी ऑब्जेक्ट में ऑपरेटर union() होता है जो किसी अन्य ऑब्जेक्ट पर काम करता है, a1.union(a2), और उसी प्रकार की तीसरी वस्तु देता है।

मैं वस्तुओं की एक सूची है:

L = [a1, a2, a3, ...] 

कैसे सूची comprehensions के साथ इन सभी वस्तुओं का मिलन(), के समकक्ष की:

result = reduce(lambda a, b :a.union(b), L[1:], L[0]) 
+1

कुछ मामलों में: नहीं। लेकिन निर्भर करता है। कृपया एक विशिष्ट क्वेरी प्रदान करें जो आपके दिमाग में है – sshashank124

+1

@ sshashank124 - कोई उदाहरण? – mhawke

+0

सेट यूनियन एक खराब उदाहरण हैं, क्योंकि आप केवल 'परिणाम = सेट()। यूनियन (* एल) 'कर सकते हैं, जिसमें एल एक खाली सूची है, भले ही काम करने का बोनस हो। किसी भी दर पर, 'lambda a, b: a.union (b)' को 'set.union' के रूप में अधिक संक्षेप में लिखा जा सकता है, क्योंकि python 'obj.method (args) में' cls.method (obj) जैसा ही है , तर्क) ' – Eric

उत्तर

3

नहीं वास्तव में। सूची की समझ map, और संभवतः filter के समान होती है।

3

चूंकि एक सूची समझ परिभाषात्मक रूप से एक और सूची उत्पन्न करती है, इसलिए आप इसका उपयोग एक मूल्य उत्पन्न करने के लिए नहीं कर सकते हैं। के लिए नहीं हैं। (ठीक है ... this nasty trick है जो कि पाइथन के पुराने संस्करणों में एक लीक कार्यान्वयन विस्तार का उपयोग करता है जो इसे कर सकता है। मैं यहां उदाहरण कोड की प्रतिलिपि बनाने के लिए भी नहीं जा रहा हूं। ऐसा न करें।)

यदि आप reduce() के स्टाइलिस्ट पहलुओं के बारे में चिंतित हैं और इसके जैसे, मत बनो। अपनी कटौती का नाम दें और आप ठीक होंगे। इसलिए जब:

all_union = reduce(lambda a, b: a.union(b), L[1:], L[0]) 

महान नहीं है, यह:

def full_union(input): 
    """ Compute the union of a list of sets """ 

    return reduce(lambda a, b: a.union(b), input[1:], input[0]) 

result = full_union(L) 

बहुत स्पष्ट है।

आप गति, बाहर toolz और cytoolz संकुल, जो क्रमशः 'तेज' और 'अत्यंत तेज,' कर रहे हैं जांच बारे में चिंतित हैं। बड़े डेटासेट पर, वे आपको अक्सर एक बार से अधिक बार अपने डेटा को संसाधित करने या सूची में समझ के विपरीत स्मृति में पूरे सेट को लोड करने से बचने देंगे।

+0

'कम()' अभिव्यक्ति स्वयं को पठनीय बनाने के लिए, पहला तर्क लैम्बडा नहीं बनाते हैं। उदाहरण के लिए: 'कम करें (set.union, )' कभी-कभी आपको कॉल को 'कम करने' के लिए कहीं भी ऑपरेटर को परिभाषित करने (और इसलिए नाम) को परिभाषित करने की आवश्यकता होगी। – Jordan

16

यह कोई रहस्य नहीं है कि पाइथोनिस्टस के not among the favored functions को कम करें।

def fold(func, iterable, initial=None, reverse=False): 
    x=initial 
    if reverse: 
     iterable=reversed(iterable) 
    for e in iterable: 
     x=func(x,e) if x is not None else e 
    return x 

कुछ नृशंस हैक बिना, इस दोहराया नहीं जा सकता:

Generically, reduce एक left fold on a list

यह अजगर में एक गुना कि या छोड़ दिया एक iterable पर सही गुना होगा लिखने के धारणात्मक आसान है एक समझ में क्योंकि समझ में संचयक प्रकार का कार्य नहीं है।

बस कम करें - या एक लिखें जो आपको अधिक समझ में आता है।

1

सूचियों का एक सूची फ़्लैट करना कम करने का एक आम उपयोग है। आप इसके बजाय एक सूची समझ का उपयोग कर सकते हैं।

L = [[1, 2, 3], [2, 3, 4], [3, 4, 5]] 
सूची कंप्यूटर अनुप्रयोग
flattened = [item for sublist in L for item in sublist] 

print(flattened) 

[1, 2, 3, 2, 3, 4, 3, 4, 5] 

आपकी समस्या को चपटा सूची पर काम करके हल किया जा सकता है के साथ

from functools import reduce # python 3 
flattened = reduce(lambda x, y: x + y, L) 

print(flattened) 

[1, 2, 3, 2, 3, 4, 3, 4, 5] 

को कम से

, इस के लिए एक प्रभावी प्रतिस्थापन है। दिए गए उदाहरण के लिए इन वन-लाइनर्स को कंट्रास्ट करें:

all_union = reduce(lambda a, b: set(a).union(set(b)), L) 

{1, 2, 3, 4, 5} 

all_union = set([item for sublist in L for item in sublist]) 

{1, 2, 3, 4, 5} 

+0

'योग (एल, [])' का प्रयोग करें। उस ने कहा, योग/सूची समझ एक "पूर्ण लंबाई" सूची बनाता है, जहां 'कमी (operator.or_, मानचित्र (सेट, एल), सेट())' नहीं होगा। –

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