2015-10-13 4 views
5

वर्तमान में, मैं निम्नलिखित आवश्यकता को पूरा करने के लिए सही डेटा संरचना ढूंढना चाहता हूं।पाइथन में सेट में एकाधिक समकक्ष कुंजी का प्रतिनिधित्व करने के लिए डेटा संरचना?

अव्यवस्थित तत्व के साथ कई सरणियों, उदाहरण के लिए कर रहे हैं,

[1, 2], [2, 1], [3, 2, 2], [2], [2, 1, 3], [2, 2, 3]

उन डेटा संसाधित करने के बाद, परिणाम है,

[1, 2], [2, 2, 3], [2], [1, 2, 3]

प्रत्येक सरणी और फिल्टर में क्रमबद्ध तत्व के साथ

डुप्लिकेट सरणी।

यहाँ मेरे विचार कर रहे हैं:

  • डेटा संरचना Set(Arrays)? - अनुत्तीर्ण होना। ऐसा लगता है में केवल एक ही सरणी set

    set([])

  • डेटा संरचना Array(Sets) निर्माण में नहीं है? - अनुत्तीर्ण होना। हालांकि, set में बिल्ड-इन में कोई डुप्लिकेट तत्व नहीं है। मैं जानना चाहता हूं कि पाइथन के भीतर सी ++ में multiset जैसी एक डेटा संरचना है या नहीं?

+0

Btw, उन सामान्य अजगर सूचियों, नहीं अजगर [सरणियों] (https की तरह लग रहे। python.org/3/library/array.html)s; लोकप्रिय तृतीय-पक्ष पैकेज Numpy भी [सरणी] प्रदान करता है (http://docs.scipy.org/doc/numpy/user/basics.creation.html) प्रकार। –

+0

मानचित्र (सूची, सेट (tuple (क्रमबद्ध (i)) में मैं एक के लिए)), यदि इनपुट – Vineesh

+0

@ विनीश है: कृपया टिप्पणियों में जवाब न दें। –

उत्तर

5

अपनी सूची टपल करने के लिए, फिर वापस सूची में रूपांतरण (इस प्रकार सेट के एक आइटम हो सकता है)।

>>> [list(i) for i in set([tuple(sorted(i)) for i in a])] 
[[1, 2], [2], [2, 2, 3], [1, 2, 3]] 
2

इस प्रयास करें:

[list(i) for i in set(map(tuple, a))] 

संपादित करें: यह मानते हुए कि list पहले से ही हल कर रहा है। मुझे याद दिलाने के लिए @ PM2RING का धन्यवाद। एक लाइनर

[list(i) for i in set(map(tuple, (sorted(i) for i in a)))] 

Demo

2

कोई अजगर, नहीं है एक अंतर्निहित मल्टीसेट;: यदि नहीं, तो इस रेखा से ऊपर

a = [sorted(i) for i in a] 

धन्यवाद फिर से @ PM2RING में जोड़ें मानक मॉड्यूल में निकटतम समकक्ष collections.Counter है, जो एक प्रकार का शब्दकोश है। एक काउंटर आपकी आवश्यकताओं के लिए उपयुक्त हो सकता है, लेकिन बिना किसी संदर्भ के बताना मुश्किल है।


ध्यान दें कि सेट कर अलावा के आदेश को संरक्षित नहीं।आप सूचियों का प्रारंभिक आदेश को संरक्षित करने की जरूरत है, तुम क्या आप इस तरह चाहते हैं कर सकते हैं:

[[1, 2], [2, 2, 3], [2], [1, 2, 3]] 

data = [[1, 2], [2, 1], [3, 2, 2], [2], [2, 1, 3], [2, 2, 3]] 

a = set() 
outlist = [] 
for s in data: 
    t = tuple(sorted(s)) 
    if t not in a: 
     a.add(t) 
     outlist.append(list(t)) 

print(outlist) 

उत्पादन इनपुट सूचियों की संख्या काफी छोटे आप डॉन है ' टी सेट की आवश्यकता नहीं है (और सूची < -> टुपल रूपांतरण), बस outlist में सदस्यता की जांच करें। हालांकि, यह बड़ी इनपुट सूचियों के लिए सक्षम नहीं है क्योंकि यह सूची में रैखिक खोज करता है।

+1

उस रैखिक खोज के बिना एक अधिक कुशल डी-डुप्ले के लिए मेरा उत्तर देखें – wim

4
lst = [[1, 2], [2, 1], [3, 2, 2], [2], [2, 1, 3], [2, 2, 3]] 
map(list, set(map(tuple, map(sorted, lst))) 

आउटपुट:

[[1, 2], [2], [2, 2, 3], [1, 2, 3]] 
+3

मुझे नहीं पता, बच्चे इन दिनों, और उनके फैंसी schmancy कार्यात्मक प्रोग्रामिंग। :) –

+0

एलओएल! मुझे पता है कि Guido दृढ़ता से ऑब्जेक्ट करेगा :-) – haavee

+0

आम तौर पर मैं मानचित्र से नफरत करता हूं, लेकिन यह एक अच्छा है! – wim

2

समाधान यहां वर्तमान में आदेश को नष्ट कर रहे हैं में से कुछ। मुझे यकीन है कि अगर आप या नहीं करने के लिए महत्वपूर्ण है नहीं कर रहा हूँ, लेकिन यहाँ एक संस्करण जो मूल आदेश को बरकरार रखता है है: // डॉक्स:

>>> from collections import OrderedDict 
>>> A = [[1, 2], [2, 1], [3, 2, 2], [2], [2, 1, 3], [2, 2, 3]] 
>>> [list(k) for k in OrderedDict.fromkeys(tuple(sorted(a)) for a in A)] 
[[1, 2], [2, 2, 3], [2], [1, 2, 3]] 
संबंधित मुद्दे

 संबंधित मुद्दे