2012-02-16 14 views
7

को बनाए रखना मैं sublist संरचना को हाथ लगाए बिना सूचियों की एक सूची से DeleteDuplicates करना चाहते हैं।DeleteDuplicates जबकि sublist संरचना

उदा।

{{1, 7, 8}, {4, 3}, {4, 1, 9}, {9, 2}}

{{1, 7, 8}, {4, 3}, {9}, {2}}

हो जाता है इस घोंसले की हद तक है, और खाली उप-सूचियों ठीक हैं।

+0

स्टैक एक्सचेंज में आपका स्वागत है। अच्छा पहला सवाल है। आप गणित (बीटा) साइट के बारे में भी जानना चाहेंगे: http://mathematica.stackexchange.com/ – DavidC

उत्तर

11

यह एक क्लासिक चाल है:

list = {{1, 7, 8}, {4, 3}, {4, 1, 9}, {9, 2}} 

Module[{f}, 
f[x_] := (f[x] = Sequence[]; x); 
Map[f, list, {2}] 
] 

को समझने के लिए कि यह कैसे काम करता है, पर विचार जब f[1] पहली बार के लिए मूल्यांकन किया जाता है क्या होता है। f[1] सिर्फ 1 तो, (f[1]=Sequence[]); 1 करने का मूल्यांकन करेंगे। तो अब f[1] के लिए एक परिभाषा बनाई गई है। अगली बार f[1] का मूल्यांकन किया गया है, यह केवल Sequence[] का मूल्यांकन करेगा।

तो, पहली बार f एक बहस के लिए मूल्यांकन किया जाता है, यह उस तर्क देता है। दूसरा (या तीसरा, आदि) समय का मूल्यांकन किया जाता है, यह Sequence[] देता है। Sequence[] गुण है कि यह पूरी तरह से भाव से बाहर छीन हो जाएगी, अर्थात {1, Sequence[], 3}{1, 3} करने का मूल्यांकन करेंगे है।

संक्षेप में, क्या समारोह करता है: पहली बार यह एक तत्व को देखता है, यह अपने आप के साथ तत्व (इसे अकेले छोड़ देता है) बदल देता है। दूसरी बार यह एक ही तत्व को देखता है, यह इसे हटा देता है। मैंने इस समारोह को "level 2" पर मैप किया है, इसलिए यह केवल उपन्यासकारों के तत्वों पर ही कार्य करेगा।

+0

Szabolcs, क्या आप समझाएंगे कि यह कैसे काम करता है? – DavidC

+0

@Szabolics धन्यवाद, जब मैं इस पर हमला करने की कोशिश कर रहा था तो मुझे कुछ कोड आया जो संकेत दिया गया कि 'अनुक्रम []' उपयोगी हो सकता है। मैं इसे अनपैक करने की कोशिश करूंगा ... जिस तरह से यह सराहना करता है उस पर कोई शैक्षणिक टिप्पणियां! [पुराने स्कूल] जाने के लिए –

+0

+1 (http: // stackoverflow।कॉम/ए/5248866/618728) –

3

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

DeleteDuplicatesList[l_List] := 
    Block[{a = {}}, 
    Table[With[{b = a}, 
    a = Union[a, c]; 
    Complement[c, b]], {c, l}] 
    ]; 

l = {{1, 7, 8}, {4, 3}, {4, 1, 9}, {9, 2}}; 
DeleteDuplicatesList[l] 
+0

धन्यवाद, मुझे 'पूरक' का उपयोग करने का दृष्टिकोण पसंद है। यद्यपि यह प्रारंभिक समस्या के तरीके से स्पष्ट नहीं है, लेकिन इन सभी के लिए एक सेट-सैद्धांतिक पृष्ठभूमि है। –

2

यह सुंदर नहीं है, लेकिन यह काम किया जाता है:

t = {{1, 7, 8}, {4, 3}, {4, 1, 9}, {9, 2}}; 

Delete[t, Flatten[Rest[Position[t, #]] & /@ (DeleteDuplicates[Flatten[t]]), 1]] 

DeleteDuplicates ... सेट लौटाता है , बहु-सेट नहीं, टी में संख्याओं की। Rest[Position[ ... डुप्लिकेट की स्थिति वापस कर देगा। Delete डुप्लीकेट्स को हटा देता है।