बिना उपयोग किए एक पंक्ति में दो सेट कैसे जुड़ेंगे?


171

मान लें कि Sऔर Tसेट निर्धारित हैं। जॉइन ऑपरेटर के उपयोग के बिना |, मैं दो सेटों का मिलन कैसे कर सकता हूं? यह, उदाहरण के लिए, प्रतिच्छेदन पाता है:

S = {1, 2, 3, 4}
T = {3, 4, 5, 6}
S_intersect_T = { i for i in S if i in T }

तो मैं बिना उपयोग किए एक पंक्ति में दो सेटों का मिलन कैसे कर सकता हूं |?


1
क्या आपको संघ बनाने की आवश्यकता है? यदि हाँ तो आप s.union (t)
Ansuman Bebarta

59
आप उपयोग क्यों नहीं कर सकते |?
स्कॉट बार्टेल

1
उपयोग करने के लिए कोई सामान्य कारण |?
Matanster

5
एक कारण फ़ंक्शन तर्क के रूप में सेट ऑपरेशन पास करना हो सकता है। एक समारोह की कल्पना करो, कुछ इस तरह def apply_set_operation(a, b, set_operation):। जब इस कार्यप्रणाली को कॉल, मैं पसंद करते हैं apply_set_operation(a, b, set.union)करने के लिएapply_set_operation(a, b, set.__or__)
बीएसए

जवाबों:


309

आप सेट के लिए संघ विधि का उपयोग कर सकते हैं: set.union(other_set)

ध्यान दें कि यह एक नया सेट लौटाता है अर्थात यह स्वयं को संशोधित नहीं करता है।


54
हालांकि, |परिवर्तनशील इनलाइन को संशोधित कर सकते हैं:set_a |= set_b
jorgenkg

12
@ जोर्जेनकॉग उसी के रूप में set_a = set_a.union(set_b):। यदि आप "इन-प्लेस" का अर्थ रखते हैं, तो न तो ऐसा करेंगे, दोनों set
नव-

3
@jorgenkg यह अभी भी एक नया सेट बनाता है और संदर्भ को बदलता है।
अल्वारो

3
एक सरल परीक्षण के अनुसार @ अलवारो @:, @ जोर्गेंनग a = set((1, 2, 3,)); b = set((1, 3, 4,)); id_a = id(a); a |= b; assert id_a == id(a)सही है - चर aको इनलाइन में संशोधित किया गया है। क्या मैं कुछ भूल रहा हूँ?
जॉन्डोडो

3
नहीं, ऐसा नहीं लगता है a = set((1, 2, 3,)); b = set((1, 3, 4,)); c = a; a |= b; assert id(c) == id(a):। अगर aनष्ट हो जाता, cतो भी नहीं होता। इसके अलावा, cअब है set([1, 2, 3, 4]), इसलिए @ jorgenkg की टिप्पणी सही है।
जॉन्डोडो

45

आप or_उपनाम का उपयोग कर सकते हैं :

>>> from operator import or_
>>> from functools import reduce # python3 required
>>> reduce(or_, [{1, 2, 3, 4}, {3, 4, 5, 6}])
set([1, 2, 3, 4, 5, 6])

9
इस दृष्टिकोण से प्यार है, और अधिक कार्यात्मक, और 2 या अधिक सेट पर लागू किया जा सकता है।
कॉलिन सु

42

यदि आप मूल सेट को संशोधित करने के साथ ठीक हैं (जो आप कुछ मामलों में करना चाहते हैं), आप उपयोग कर सकते हैं set.update():

S.update(T)

वापसी मान है None, लेकिन Sमूल के मिलन के लिए अद्यतन किया जाएगा Sऔर T


23

यह मानते हुए कि आप उपयोग नहीं कर सकते हैं s.union(t), जो इसके बराबर है s | t, आप कोशिश कर सकते हैं

>>> from itertools import chain
>>> set(chain(s,t))
set([1, 2, 3, 4, 5, 6])

या, यदि आप एक समझ चाहते हैं,

>>> {i for j in (s,t) for i in j}
set([1, 2, 3, 4, 5, 6])

14

यदि आप संघ से जुड़ते हैं, तो यह प्रयास करें:

set(list(s) + list(t))

यह थोड़ा हैक है, लेकिन मैं इसे करने के लिए एक बेहतर लाइनर के बारे में नहीं सोच सकता।


सेट (सूची) (सूची) (सूची) (टी) आपको एक ही परिणाम देगा यदि आप एक संघ करेंगे।
अंसुमन बेबर्टा

मुझे पता है, लेकिन ऐसा लगता है कि वह अजगर कार्यों में निर्मित से बचने की कोशिश कर रहा था, अन्यथा वह सिर्फ इस्तेमाल किया होगा ऑपरेटर।
बेंजामिन

listऔर setअजगर कार्यों में बनाया गया है
whackamadoodle3000

10

मान लीजिए आपके पास 2 सूचियाँ हैं

 A = [1,2,3,4]
 B = [3,4,5,6]

इसलिए आप Aसंघ Bको अनुसरण के रूप में पा सकते हैं

 union = set(A).union(set(B))

अगर आप चौराहे और गैर-चौराहे ढूंढना चाहते हैं, तो आप इसका अनुसरण करें

 intersection = set(A).intersection(set(B))
 non_intersection = union - intersection

7

आप बस दोनों सेटों को इस तरह एक में खोल सकते हैं:

>>> set_1 = {1, 2, 3, 4}
>>> set_2 = {3, 4, 5, 6}
>>> union = {*set_1, *set_2}
>>> union
{1, 2, 3, 4, 5, 6}

*सेट unpacks। अनपैकिंग वह जगह है जहां एक पुनरावृत्ति (जैसे एक सेट या सूची) का प्रतिनिधित्व किया जाता है, क्योंकि यह प्रत्येक आइटम को पैदावार देता है। इसका मतलब यह है कि उपरोक्त उदाहरण सरल हो {1, 2, 3, 4, 3, 4, 5, 6}जाता है और फिर सरल हो जाता है {1, 2, 3, 4, 5, 6}क्योंकि सेट में केवल अद्वितीय आइटम हो सकते हैं।


*लाइन 3 में क्या करता है ?
वल्बक

5

आप कर सकते हैं unionया सरल सूची समझ

[A.add(_) for _ in B]

A में B के सभी तत्व होंगे


अनाम प्रभावों के लिए सूची समझ का उपयोग करना और अनाम परम के साथ सुपर बुरा अभ्यास है।
जीन फ़्राँस्वा Fabre
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.