सेट करने के लिए सूची जोड़ें?


242

पायथन 2.6 इंटरप्रेटर पर परीक्षण किया गया:

>>> a=set('abcde')
>>> a
set(['a', 'c', 'b', 'e', 'd'])
>>> l=['f','g']
>>> l
['f', 'g']
>>> a.add(l)
Traceback (most recent call last):
  File "<pyshell#35>", line 1, in <module>
    a.add(l)
TypeError: list objects are unhashable

मुझे लगता है कि मैं सूची को सेट में शामिल नहीं कर सकता क्योंकि कोई रास्ता नहीं है, पायथन बता सकता है कि क्या मैंने एक ही सूची को दो बार जोड़ा है। क्या आसपास कोई काम है?

संपादित करें: मैं सूची को स्वयं जोड़ना चाहता हूं, इसके तत्वों को नहीं।


2
क्या आप सूची में सूची या आइटम में सूची जोड़ना चाहते हैं?
pkit

सूची ही - मैं सूची का एक सेट है चाहता हूँ।
एडम मटन

लगता है कि सबसे अनुकूल उत्तर कुछ अंडरस्टैड (आईडी (lst)) का उपयोग करते हुए किया गया है, जो किसी सूची / कतार / आदि में खुद को जोड़ने से पहले यह सुनिश्चित करने का सुझाव देता है कि आपने यह किया है। आपको स्वीकृत उत्तर पर पुनर्विचार करना चाहिए।
रुस्तम ए।

जवाबों:


187

आप सूची में सेट नहीं कर सकते क्योंकि सूचियाँ परस्पर हैं, जिसका अर्थ है कि आप सूची में सामग्री को सेट करने के बाद जोड़ सकते हैं।

हालाँकि आप सेट में टुपल्स जोड़ सकते हैं, क्योंकि आप एक टपल की सामग्री को नहीं बदल सकते हैं:

>>> a.add(('f', 'g'))
>>> print a
set(['a', 'c', 'b', 'e', 'd', ('f', 'g')])

संपादित करें : कुछ स्पष्टीकरण: दस्तावेज़ीकरण अलग-अलग धोने योग्य वस्तुओं के एक अनियंत्रित संग्रह केset रूप में परिभाषित करता है वस्तुओं को हाथ से धोना पड़ता है ताकि तत्वों को खोजने, जोड़ने और हटाने के लिए प्रत्येक व्यक्तिगत तत्व को देखने की तुलना में तेजी से किया जा सके, जब भी आप इन कार्यों को करते हैं। उपयोग किए गए विशिष्ट एल्गोरिदम को विकिपीडिया लेख में समझाया गया है । अजगर हैशिंग एल्गोरिदम को effbot.org और अजगर के संदर्भ__hash__ में अजगर के संदर्भ में बताया गया है ।

कुछ तथ्य:

  • तत्वों को सेट करें और साथ ही शब्दकोश कुंजियों को भी धो सकते हैं
  • कुछ अप्राप्य डेटाैटिप्स:
    • list: tupleइसके बजाय का उपयोग करें
    • set: frozensetइसके बजाय का उपयोग करें
    • dict: कोई आधिकारिक समकक्ष नहीं है, लेकिन कुछ व्यंजन हैं
  • ऑब्जेक्ट उदाहरण डिफ़ॉल्ट रूप से हैश में होते हैं और प्रत्येक उदाहरण में एक अद्वितीय हैश होता है। अजगर के संदर्भ में बताए गए इस व्यवहार को आप ओवरराइड कर सकते हैं।

6
और यदि आप कभी भी सेट में एक सेट जोड़ना चाहते हैं, तो फ्रेज़ेनसेट का उपयोग करें।
फॉगबर्ड

4
collections.namedtuple"आधिकारिक" समकक्ष माना जा सकता है dict
साइलेंटगॉस्ट

1
@Ahnfrieden: यह सेट की सामग्री को जोड़ रहा है , न कि सेट को ही।
ओटो ऑलमडिंगर

@ ऐहलके: नहीं, जो सेट के तत्वों को पहले सेट में जोड़ता है, लेकिन हम पहले सेट के एक तत्व के रूप में एक सेट को जोड़ने के बारे में बात कर रहे हैं।
जेफ़ लीमैन

578

का उपयोग करें set.update()या|=

>>> a = set('abc')
>>> l = ['d', 'e']
>>> a.update(l)
>>> a
{'e', 'b', 'c', 'd', 'a'}

>>> l = ['f', 'g']
>>> a |= set(l)
>>> a
{'e', 'b', 'f', 'c', 'd', 'g', 'a'}

संपादित करें: यदि आप सूची को स्वयं जोड़ना चाहते हैं और इसके सदस्यों को नहीं, तो आपको दुर्भाग्य से, एक टपल का उपयोग करना होगा। सेट सदस्यों को हैशेबल होना चाहिए ।


set.update () सेट में सूची जोड़ता है, सही है? पाइप किसके लिए ऑपरेटर के बराबर है?
फिस्टोफ्यूरी

सेट के संबंध में, |ऑपरेटर सेट यूनियन ऑपरेशन को लागू करता है । |=ऑपरेटर और set.update()विधि दोनों उस ऑपरेशन को इन-प्लेस पर लागू करते हैं और प्रभावी रूप से पर्यायवाची हैं। इसलिए, set_a |= set_bदोनों के लिए सिंटैक्टिक शुगर माना जा सकता है set_a.update(set_b) और set_a = set_a | set_b (बाद वाले मामले को छोड़कर, एक ही set_aवस्तु को पुन: असाइन किए जाने के बजाय पुन: उपयोग किया जाता है)। </ahem>
सेसिल करी

76

करने के लिए एक सेट के लिए एक सूची के तत्वों को जोड़ने , उपयोगupdate

से https://docs.python.org/2/library/sets.html

s.update (t): t से जोड़े गए तत्वों के साथ रिटर्न सेट s

उदाहरण के लिए

>>> s = set([1, 2])
>>> l = [3, 4]
>>> s.update(l)
>>> s
{1, 2, 3, 4}

यदि आप इसके बजाय पूरी सूची को सेट के एकल तत्व के रूप में जोड़ना चाहते हैं , तो आप नहीं कर सकते क्योंकि सूचियाँ उपलब्ध नहीं हैं। आप इसके बजाय टपल जोड़ सकते हैं, उदा s.add(tuple(l))टाइपर्र को भी देखें : उस पर अधिक जानकारी के लिए अंतर्निहित सेट फ़ंक्शन का उपयोग करते समय अस्वास्थ्यकर प्रकार: 'सूची'


40

उम्मीद है कि यह मदद करता है:

>>> seta = set('1234')
>>> listb = ['a','b','c']
>>> seta.union(listb)
set(['a', 'c', 'b', '1', '3', '2', '4'])
>>> seta
set(['1', '3', '2', '4'])
>>> seta = seta.union(listb)
>>> seta
set(['a', 'c', 'b', '1', '3', '2', '4'])

15

कृपया फ़ंक्शन को देखें set.update()। प्रलेखन कहता है:

स्वयं और दूसरों के मिलन के साथ एक सेट अपडेट करें।


5
यह सवाल का जवाब नहीं देता है (चूंकि ओपी स्वयं सूची को सेट में जोड़ना चाहता है), लेकिन यह वह उत्तर था जिसकी मुझे आवश्यकता थी जब Google मुझे यहां लाया :-):
टॉम स्ट्रैटन

1
खैर, यह मेरे लिए सवाल का सबसे अधिक प्रासंगिक उत्तर की तरह लगता है ... उदाहरण के लिए, यदि b = सेट ([1]), b.update ([7,25]) बी को निम्न मूल्य देगा: सेट ([ 1, 25, 7]) ---> क्या हम यहां नहीं देख रहे हैं?
लुई एलसी

8

सूची की वस्तुएँ अप्राप्य हैं । हालांकि आप उन्हें टुपल्स में बदलना चाहते हैं।


5

सेट में परिवर्तनशील (परिवर्तनशील) तत्व / सदस्य नहीं हो सकते। एक सूची, जो परिवर्तनशील है, एक सेट का सदस्य नहीं हो सकती।

चूंकि सेट आपस में मिलते हैं, आपके पास सेट का एक सेट नहीं हो सकता है! आपके पास फ्रोज़ेनसेट्स का एक सेट हो सकता है।

(उसी तरह की "परिवर्तनशीलता की आवश्यकता" एक तानाशाह की चाबी पर लागू होती है।)

अन्य उत्तर आपको पहले ही कोड दे चुके हैं, मुझे उम्मीद है कि इससे थोड़ी जानकारी मिलेगी। मुझे उम्मीद है कि एलेक्स मार्टेली और भी अधिक विवरण के साथ जवाब देगा।


4

आप एक सूची जोड़ना चाहते हैं, एक सूची नहीं:

>>> a=set('abcde')
>>> a
set(['a', 'c', 'b', 'e', 'd'])
>>> l=['f','g']
>>> l
['f', 'g']
>>> t = tuple(l)
>>> t
('f', 'g')
>>> a.add(t)
>>> a
set(['a', 'c', 'b', 'e', 'd', ('f', 'g')])

यदि आपके पास एक सूची है, तो आप टपल को रूपांतरित कर सकते हैं, जैसा कि ऊपर दिखाया गया है। एक टपल अचल है, इसलिए इसे सेट में जोड़ा जा सकता है।


4

मैंने पाया कि मुझे आज भी कुछ ऐसा ही करने की जरूरत है। एल्गोरिथ्म जानता था कि यह एक नई सूची बना रहा है जिसे सेट में जोड़ा जाना चाहिए, लेकिन तब नहीं जब यह सूची पर काम करना समाप्त कर देता।

वैसे भी, मैं जो व्यवहार चाहता था वह उपयोग करने के idबजाय सेट करने के लिए था hash। जैसे कि मुझे वह व्यवहार पेश करने के mydict[id(mylist)] = mylistबजाय मिला myset.add(mylist)जो मैं चाहता था।


3

आप tuples का उपयोग करना चाहते हैं, जो कि हैशेबल है (आप किसी सूची की तरह एक उत्परिवर्तनीय वस्तु को हैश नहीं कर सकते हैं)।

>>> a = set("abcde")
>>> a
set(['a', 'c', 'b', 'e', 'd'])
>>> t = ('f', 'g')
>>> a.add(t)
>>> a
set(['a', 'c', 'b', 'e', 'd', ('f', 'g')])

2

यहाँ है कि मैं आमतौर पर यह कैसे करते हैं:

def add_list_to_set(my_list, my_set):
    [my_set.add(each) for each in my_list]
return my_set

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