2014-04-05 13 views
11

मुझे लगता है कि यह सेट mutable से संबंधित हो सकता है।किसी सेट से तत्व को कैसे निकालें?

असल में, मैं set.discard(element) का उपयोग कर एक सेट से तत्व हटा सकता हूं। हालांकि, set.discard(element) स्वयं None लौटाता है। लेकिन मैं अद्यतन सेट की एक प्रति प्राप्त करना चाहता हूं। उदाहरण के लिए, यदि मेरे पास सेट की एक सूची है, तो मैं सूची समझने के संचालन का उपयोग करके आसानी से एक अद्यतन प्रति कैसे प्राप्त कर सकता हूं?

नमूना कोड:

test = [{'', 'a'}, {'b', ''}] 
print [x.discard('') for x in test] 
print test 

वापस आ जाएगी

[None, None] 
[set(['a']), set(['b'])] 
+0

SOF इस तरह के एक अद्भुत स्थान है! @thefourtheye और @roippi दोनों अच्छी तरह से काम का जवाब देते हैं! @roippi उत्तर में एक गति लाभ है और इसमें भी व्यापक आवेदन हो सकता है। मैंने केवल @thefourtheye उत्तर स्वीकार किया क्योंकि यह मेरे मामले में आसानी से काम करता है, जहां सूचियों की सूची से सेट की सूची उत्पन्न होती है। तो मैं बस सूची में एक्स के लिए '[सेट (एक्स) - {' '} कोड कर सकता हूं] '। लेकिन आप दोनों के लिए बहुत धन्यवाद! –

+0

क्या सूची समझ को मूल सेट में कोई संशोधन नहीं होने के साथ सेट की एक स्वतंत्र सूची में परिणाम होना चाहिए, या इसे मूल को संशोधित करना चाहिए? यदि आप मूल को संशोधित करना चाहते हैं, तो सबसे अच्छी सूची सूची का उपयोग न करना सबसे अच्छा है; एक 'फॉर लूप अधिक उपयुक्त है। – user2357112

+0

@ user2357112 मैं मूल को संशोधित करना चाहता हूं (यह वास्तव में कोई फर्क नहीं पड़ता है लेकिन डेटासेट बड़ा होने के बाद से, मैं प्रतियां बनाना नहीं चाहता हूं)। इस मामले में सूची समझ से 'लूप' के लिए क्या कारण है? –

उत्तर

7

आप set difference operator उपयोग कर सकते हैं, इस

test, empty = [{'', 'a'}, {'b', ''}], {''} 
print [x - empty for x in test] 
# [set(['a']), set(['b'])] 
+1

यह ओपी की वास्तविक समस्या को अच्छी तरह हल कर सकता है लेकिन यह उनके प्रश्न में जो कुछ भी मांगता है उससे वह अलग-अलग है क्योंकि यह मूल सेट को संशोधित नहीं करता है। –

+0

मैं @AdrianRatnapala से सहमत हूं और मुझे लगता है कि roippi का सही जवाब है। –

9

की तरह जब भी आप एक विधि है कि केवल इन-जगह काम करता है द्वारा विवश महसूस , आप or/and के व्यवहार को प्राप्त करने के लिए उपयोग कर सकते हैं आप चाहते हैं कि अर्थशास्त्र है।

[x.discard('') or x for x in test] 

इस तकनीक अन्यथा असंभव है कि एक lambda (या अन्य स्थितियों में, जहां आप एक ही अभिव्यक्ति के लिए प्रतिबंधित कर रहे हैं) में चीजों को प्राप्त करने के लिए कभी कभी उपयोगी है। यह सबसे "पठनीय" या "pythonic" है यह बहस का मुद्दा :-)

+3

सावधान रहें कि इस मामले में बाईं तरफ 'x' न डालें या' या 'अभिव्यक्ति शॉर्ट-सर्किट होगी और उत्परिवर्तन कभी नहीं होगा। एक्स में परीक्षण के लिए [x या x.discard ('')] == [{'', 'a'}, {'', 'b'}] ' –

0

यह? (@thefourtheye जवाब का डुप्लिकेट)

set घटाव आपरेशन set डेटा देता है या नहीं।

test = [{'', 'a'}, {'b', ''}] 
print [x - {''} for x in test] 
print test 

आउटपुट:

[set(['a']), set(['b'])] 
[set(['a', '']), set(['', 'b'])] 
संबंधित मुद्दे