2010-08-09 8 views
23

मान लीजिए कि मेरे पास सेट की एक सूची है और मैं उस सूची में सभी सेटों पर संघ प्राप्त करना चाहता हूं। जनरेटर अभिव्यक्ति का उपयोग करके ऐसा करने का कोई तरीका है? दूसरे शब्दों में, मैं उस सूची में सीधेfrozenset के रूप में सभी सेटों पर संघ कैसे बना सकता हूं?जनरेटर अभिव्यक्ति का उपयोग करके कई सेटों का संघ कैसे बनाएं?

+0

भी देखें: http://stackoverflow.com/ ए/5182801/1 9 5 9 808 –

उत्तर

43

बस the .union() method का उपयोग करें।

>>> l = [set([1,2,3]), set([4,5,6]), set([1,4,9])] 
>>> frozenset().union(*l) 
frozenset([1, 2, 3, 4, 5, 6, 9]) 

यह पुनरावृत्तियों के किसी भी पुनरावर्तनीय के लिए काम करता है।

+1

बस ध्यान दें कि 'frozenset.union' को एक अनबाउंड विधि के रूप में उपयोग करने के लिए क्लीनर है, यदि 'l' में' frozenset's eg 'Frozenset.union (* एल)'। 'Set.union' के लिए वही। – vaultah

4

नेस्टेड जेनरेटर अभिव्यक्ति। लेकिन मुझे लगता है कि वे थोड़ा सा गूढ़ हैं, इसलिए जिस तरह से केनीटीएम सुझाव दिया गया वह स्पष्ट हो सकता है।

frozenset(some_item for some_set in some_sets for some_item in some_set) 
+1

चतुरता के लिए +1 – aaronasterling

+0

यह वास्तव में स्पष्ट है, लेकिन केनी के समाधान से लगभग 4 गुना धीमी है – fransua

5

मुझे लगता है कि क्या आप से बचने के लिए कोशिश कर रहे हैं frozenset वस्तुओं के मध्यवर्ती कृतियों आप संघ का निर्माण कर रहे हैं के रूप में है?

इसे करने का एक तरीका यहां है। नोट: इस मूल itertools.chain() थे, लेकिन केनी की टिप्पणी नोटों के रूप में, नीचे दिए गए संस्करण थोड़ा बेहतर है:

import itertools 

def mkunion(*args): 
    return frozenset(itertools.chain.from_iterable(args)) 

आह्वान इस तरह:

a = set(['a','b','c']) 
b = set(['a','e','f']) 
c = mkunion(a,b)  # => frozenset(['a', 'c', 'b', 'e', 'f']) 
+0

यदि आप '.chain (* args) 'पर जा रहे हैं तो' chain.from_iterable' 'का उपयोग करें। – kennytm

+0

@ केनीटीएम: अच्छा बिंदु, मैंने बदलाव किया है। –

+1

मेरे प्रदर्शन परीक्षण परिणाम (पायथन 3 के साथ): सेट्स की संख्या <10000 की संख्या के साथ केनीटीएम की प्रतिक्रिया थोड़ा तेज़ है, लेकिन यह प्रतिक्रिया 30000 सेट के साथ थोड़ा तेज है –

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