कई सूचियों में निहित सभी मूल्यों के मिलन के लिए पाइथोनिक तरीका


84

मेरे पास सूचियों की एक सूची है:

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

मैं इस सूची को समतल करना और सभी डुप्लिकेट को निकालना चाहता हूं; या, दूसरे शब्दों में, एक सेट यूनियन ऑपरेशन लागू करें:

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

ऐसा करने का सबसे आसान तरीका क्या है?

जवाबों:


152

set.union क्या आप चाहते हैं:

>>> results_list = [[1,2,3], [1,2,4]]
>>> results_union = set().union(*results_list)
>>> print(results_union)
set([1, 2, 3, 4])

आप इसे दो से अधिक सूचियों के साथ भी कर सकते हैं।


@sth, उदाहरण के लिए धन्यवाद, लेकिन जब मैं इसे चलाता हूं तो मुझे एक त्रुटि मिलती है: Traceback (सबसे हालिया कॉल अंतिम): फ़ाइल "so_example.py", पंक्ति 33, में? results_union = set ()। Union (* result_lists) TypeError: Union () बिल्कुल एक तर्क (3 दिया)
AJ

1
@AJ: दस्तावेज़ के अनुसार ( docs.python.org/library/stdtypes.html#set.union ) union()केवल पायथन संस्करण 2.6 या उच्चतर के लिए कई तर्कों का समर्थन करता है। आप उससे पहले एक संस्करण का उपयोग करते हैं, इसलिए आपको संभवतः एक स्पष्ट लूप का उपयोग करना होगा: total = set(); for x in results_list: total.update(x) (s /? / \ N /)
sth

2
आप 2 लाइन को बदलकर एक खाली सेट बनाने से भी बचा सकते हैंresults_union = set.union(*(set(el) for el in results_list))
नोएल इवांस

1
@ जीन-फ्रैंकोइस फैबरे TypeError: descriptor 'union' requires a 'set' object but received a 'list'में अजगर 3.6 कम से कम।
परितोष सिंह

1
यदि आप उपयोग set.union(*results_list)करते हैं तो आप विधि विवरणक को मैन्युअल रूप से बाइंड कर रहे हैं, अर्थात results_list"स्वयं" के पहले तत्व में भेज रहे हैं । यह कुछ अजीब प्रतिबंध बनाता है: 1. ठीक प्रकार से बतख नहीं करता है (अब पहला तत्व एक सेट उपवर्ग का एक सेट या उदाहरण होना चाहिए), और 2. एक खाली का संघ results_listएक त्रुटि होगी (गलत परिणाम - खाली लौटना चाहिए सेट)।
विम

12

चूंकि आप पायथन 2.5 का उपयोग कर रहे हैं (यह आपके क्यू में उल्लेख करने के लिए अच्छा होगा यदि आपको संस्करणों के लिए ए की आवश्यकता है! = 2.6, वर्तमान उत्पादन एक, वैसे ;-) और एक सेट के बजाय एक सूची चाहते हैं। परिणाम, मैं सलाह देता हूं:

import itertools

...

return list(set(itertools.chain(*result_list)))

itertools आम तौर पर पुनरावृत्तियों के साथ काम करने का एक शानदार तरीका है (और इसलिए कई प्रकार के दृश्यों या संग्रह के साथ) और मैं आपको दिल से इससे परिचित होने की सलाह देता हूं। itertools.chain, विशेष रूप से, यहाँ प्रलेखित है


+1 अद्भुत itertoolsपैकेज में डुबकी लगाने के लिए एक अच्छा समय का एक आदर्श उदाहरण ।

@ एलेक्स थैंक्स ... संस्करण को निर्दिष्ट करने और संस्करणों में इतना पीछे रहने के लिए खुद से दोष हटाने के लिए मेरे प्रश्न को संपादित किया :) मैं इसे इटर्टलस में देखने का सुझाव दूंगा, सुझाव की सराहना करता हूं।
ए जे।

@ ए.जे., कोई दोष नहीं, हम सभी को इस तरह की बाधाओं के बाद पीड़ित कर सकते हैं (लेकिन कृपया भविष्य में क्यूएस निर्दिष्ट करने के लिए याद रखें! -); itertools.chainPython 2.4 में ठीक काम करता है, वैसे भी।
एलेक्स मार्टेली

3

आप भी इस स्टाइल को फॉलो कर सकते हैं

In [12]: a = ['Orange and Banana', 'Orange Banana']
In [13]: b = ['Grapes', 'Orange Banana']
In [14]: c = ['Foobanana', 'Orange and Banana']

In [20]: list(set(a) | set(b) | set(c))
Out[20]: ['Orange and Banana', 'Foobanana', 'Orange Banana', 'Grapes']

In [21]: list(set(a) & set(b) | set(c))
Out[21]: ['Orange and Banana', 'Foobanana', 'Orange Banana']    

1

यूनियनों को सूचियों का समर्थन नहीं है, जो आदेश दिए गए हैं, लेकिन सेट द्वारा समर्थित हैं। की जाँच करें set.union


0

मैंने चौराहों को करने के लिए निम्नलिखित का उपयोग किया, जो सेट की आवश्यकता से बचा जाता है।

a, b= [[1,2,3], [1,2]]
s = filter( lambda x: x in b, a)

या,

s = [ x for x in b if x in a ]

5
आप "सेट की आवश्यकता से बचने" की इच्छा क्यों करेंगे? वे इस उद्देश्य के लिए तेज़ और स्पष्ट हैं। और जब आप इसे निष्पादित करते हैं, तो सूची के माध्यम से आपका "x" एक रैखिक, ब्रूट-बल खोज करता है। यक।
पीटर हैनसेन

सेट की आवश्यकता होती है टाइप कास्टिंग, और रैखिक गति खराब नहीं होती है जब तक आप एक बड़े एन के साथ काम नहीं कर रहे हैं
भालू

3
"टाइप कास्टिंग"? अजगर में? कब से? सेट मूल रूप से केवल कुंजियों के साथ dicts हैं, और वे हैश और समानता तुलना का उपयोग करते हैं। किसी सूची में "x" का उपयोग करना एक समानता की तुलना भी करता है। टाइप कास्टिंग के बारे में यह सब क्या है?
पीटर हैनसेन


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.