2012-10-25 35 views
6

यह गणित में सूची में हेरफेर पर एक मूल प्रश्न है। मेरे पास एक बड़ी सूची है जहां प्रत्येक तत्व में निम्नलिखित योजनाबद्ध रूप है: {सूची 1, सूची 2, संख्या}। उदाहरण के लिए,नेस्टेड सूचियों से तत्वों का तेज़ निष्कर्षण

a = {{{1,2,3},{1,3,2},5},{{1,4,5},{1,0,2},10},{{4,5,3},{8,3,4},15}}}

मैं एक नई सूचियां बनाना चाहता हूं जिसमें प्रत्येक उपन्यास के कुछ हिस्सों हों। उदाहरण के लिए, उपरोक्त से {5,10,15} देने के लिए प्रत्येक उपन्यासकार से तीसरा तत्व चुनें। या तीसरे तत्व को {{{1,2,3}, {1,3,2}}, {{1,4,5}, {1,0,2}}, {{4,5, 3} {8,3,4}}}।

मैं

Table[a[[i]][[3]],{i,1,Length[a]} 

तालिका आदेश का उपयोग नई सूचियों के निर्माण के लिए, उदाहरण के लिए ऐसा कर सकते हैं, लेकिन अगर वहाँ था एक तेज़ तरीका है जो बड़ी सूची पर काम करेगा चाहिए मैं सोच रहा था।

उत्तर

7

मेथेमेटिका संस्करण 5 में और उसके बाद वाले सभी कई मायनों में कीवर्ड का उपयोग कर सकते एक सूची ट्रेवर्सल निर्दिष्ट करने के लिए

उदाहरण के लिए, आपकी तालिका के बजाय, आप

a[[All,3]] 

यहां गणित पहले सभी आयामों के लिए सभी स्वीकार्य सूचकांक में परिवर्तित हो सकता है सायन फिर अगले आयाम में से एक लेता है।

गणित प्रोग्रामिंग भाषा के साथ लूप बनाने के लिए आमतौर पर ऐसा करना अधिक कुशल होता है। यह homogenous सूचियों के लिए वास्तव में ठीक है, जहां आप हमेशा चीजों को चुनना या स्कैन करना चाहते हैं।

एक और कुशल नोटेशन और शॉर्टकट है ;; वाक्य रचना:

a[[ All, 1 ;; 2]] 

एक के पहले स्तर को स्कैन और प्रत्येक sublist की 2st तत्व को 1 से सब कुछ ले, वास्तव में अपने दूसरे मामले की तरह होगा।

वास्तव में सभी और ;; किसी भी स्तर पर जोड़ा जा सकता है। ;; यहां तक ​​कि एक तरह से मेथेमेटिका में किसी भी इटरेटर के समान में इस्तेमाल किया जा सकता है:

a[[ start;;end;;step ]] 

रूप

Table[ a[[i]], {i,start,end,step}] 

एक ही काम करेंगे और आप शुरू, अंत या कदम से एक को छोड़ सकते हैं, यह से भर जाता है इसका डिफ़ॉल्ट 1, लंबाई [(निहित सूची का)], और 1.

गणित की सहायता में आप जो कुछ भी देखना चाहते हैं वह ReplacePart और MapAt है जो संरचित अभिव्यक्तियों के प्रोग्रामेटिक प्रतिस्थापन की अनुमति देता है। इस कुशलता से इसका उपयोग करने की मुख्य बात यह है कि प्रतिस्थापन में आप patterns का उपयोग करने के लिए चीजों के निर्देशांक निर्दिष्ट करने के लिए उपयोग कर सकते हैं, और आप उन्हें लागू करने के लिए कार्यों को परिभाषित कर सकते हैं।अपने डेटा

ReplacePart[a, {_, 3} -> 0] 

साथ

उदाहरण 0.

ReplacePart[a, {i : _, 3} :> 2*a[[i, 3]]] 

के साथ हर sublist के हर 3 हिस्सा की जगह हर sublist के हर 3 हिस्सा दोगुना होगा।

+0

धन्यवाद; यह वही है जिसे मैं देख रहा था। – bartimaeus

+1

ध्यान दें कि आगे के प्रश्नों के लिए, आप http://mathematica.stackexchange.com पर भी पूछ सकते हैं – ogerard

1

आप Part (इस के लिए आशुलिपि [[...]]) उपयोग कर सकते हैं:।

a[[All, 3]] 

a[[All, {1, 2}]] 
2

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

अपने एक का उपयोग करना,

a = {{{1, 2, 3}, {1, 3, 2}, 5}, {{1, 4, 5}, {1, 0, 2}, 
10}, {{4, 5, 3}, {8, 3, 4}, 15}}; 

Cases[a,{_List,_List,n_}:>n,Infinity] 

{5, 10, 15} 

एक के अन्य हिस्सों रिकॉर्ड समान रूपों से निकाला जा सकता है।

भाग- आधारित दृष्टिकोण की तरह बीमार का गठन डेटा पर झूठ होगा:

badA = {{{1, 2, 3}, {1, 3, 2}, 5}, {{1, 4, 5}, {1, 0, 2}, 
10}, {{4, 5, 3}, {8, 3, 4}, 15}, {baddata}, {{1, 2, 3}, 4}}; 

badA[[All,3]] 

{{{1, 2, 3}, {1, 3, 2}, 5}, {{1, 4, 5}, {1, 0, 2}, 
10}, {{4, 5, 3}, {8, 3, 4}, 15}, {baddata}, {{1, 2, 3}, 
4}}[[All, 3]] 

, लेकिन मामले कचरा से अधिक छोड़ देगा, अनुरूप डेटा

Cases[badA, {_List, _List, s_} :> s, Infinity] 

{5, 10, 15} 

hth पर केवल संचालन,

फ्रेड क्लिंगर