2010-09-29 11 views
7

में बहु घ सरणी से डुप्लिकेट प्रविष्टियों को हटाने मैं एक 2-डी सरणीअजगर

xx=[[a,1],[b,2],[c,3]] 

अब मैं इसे से डुप्लिकेट प्रविष्टियों को हटाने के लिए कोशिश कर रहा हूँ है। सरल 1-डी सरणी के लिए, सरल कोड जैसे

xx=list(set(xx)) 

काम करेगा। लेकिन 2-डी तत्वों पर सेट करते समय एक त्रुटि

temp = set(xx) 
TypeError: unhashable type: 'list' 

एक वैकल्पिक हल xx तत्वों को क्रमानुसार, और फिर एक सूची करने के लिए होगा (सेट()) नई सरणी पर और फिर unserialize सभी तत्वों को फिर से वापस देता है।

क्या अजगर में कोई समाधान है?

उत्तर

16

तत्वों को टुपल में कनवर्ट करें और फिर set का उपयोग करें।

>>> xx=[['a',1],['b',2],['c',3],['c',3]] 
>>> set(tuple(element) for element in xx) 
set([('a', 1), ('b', 2), ('c', 3)]) 
>>> 

सूचियों के विपरीत, टुपल्स को धोया जा सकता है। अत। और एक बार जब आप कर लेंगे, तत्वों को वापस सूची में परिवर्तित करें। सब कुछ एक साथ लाना:

>>> [list(t) for t in set(tuple(element) for element in xx)] 
[['a', 1], ['b', 2], ['c', 3]] 
+0

किसी भी तरह से डुप्लिकेट प्रविष्टियों को हटाने में कोड विफल रहा। सेट() डुप्लिकेट टुपल्स का पता लगाने में सक्षम नहीं है? – Neo

+0

@ नीओ: यह दिलचस्प हो जाता है। क्या आप कुछ नमूना मान पोस्ट कर सकते हैं? –

+0

स्ट्रिंग और समान मान की संख्या या लगभग उसी फ़्लोटिंग पॉइंट संख्या शायद? –

3

एक साल मनोज गोविंदन के उत्कृष्ट जवाब के बाद, मैं सलाह के अपने टुकड़ा जोड़ रहा:

फ्लोटिंग अंक संख्या सिर्फ एक दर्द है, तो आप चीजों की तुलना करना चाहते हैं ...

उदाहरण के लिए,

>>> 0,1 + 0,1 + 0,1 + 0,1 + 0,1 + 0,1 + 0,1 + 0,1 + 0,1 + 0,1 == 0,1 * 10

झूठी

क्योंकि आपके कंप्यूटर सही रूप में दशमलव फ्लोटिंग अंक का प्रतिनिधित्व नहीं कर सकते हैं के रूप में द्विआधारी संख्या (कंप्यूटर द्विआधारी/आधार संभाल 2 संख्या केवल, दशमलव नहीं/आधार 10) है कि।

तो फ्लोट की तुलना करते समय वास्तव में सावधान रहें!