Λίστες Επικ. Καθ. Ν. Καραµπετάκης Τµήµα Μαθηµατικών, Α.Π.Θ. Λίστες και πίνακες Η λίστα είναι ένα σύνολο αντικειµένων των οποίων τα σύµβολα περιέχονται µέσα σε άγκιστρα {}, και χωρίζονται µε κόµµα. Μας βοηθούν στην αναπαράσταση διανυσµάτων, πινάκων και συλλογή αντικειµένων όπως µεταβλητές και εκφράσεις. Παρακάτω βλέπουµε ένα παράδειγµα όπου το Mathematica απαντάει µε λίστα In[1]:= Solve@x 2 5 x + 6 0, xd Επειδή το Mathematica χρησιµοποιεί και για την είσοδο δεδοµένων αλλά και για την έξοδο των δεδοµένων τις λίστες θα πρέπει να µάθουµε την διαδικασία χειρσιµού της λίστας (δηµιουργία λίστας, χειρισµός λίστας κ.λ.π.). Μαθηµατικών, Α.Π.Θ. 1
ηµιουργία Λίστας α) τρόπος. Η δηµιουργία λίστας γίνεται µε την προσθήκη των αντικειµένων που θέλουµε µεταξύ αγκίστρων {} In[2]:= a = 81, 2, 4, 9< Στη συνέχεια µπορούµε να κάνουµε πράξεις µε τα στοιχεία της λίστας In[3]:= x^a 1 In[4]:= D@%, xd β) τρόπος Άλλος τρόπος δηµιουργίας λίστας είναι µε την εντολή Range In[5]:=? Range In[6]:= Range@5D ηµιουργία Λίστας γ) τρόπος Με χρήση της εντολής Table In[7]:=? Table Μπορούµε να έχουµε λίστα από απλές εκφράσεις In[9]:= Table@i^2, 8i, 1, 5<D ή ζεύγη εκφράσεων In[12]:= Table@8i, Prime@iD<, 8i, 1, 10<D êê TableForm Με το TableForm παρουσιάζουµε τα στοιχεία της λίστας σε µορφή πίνακα. Μπορούµε να έχουµε επίσης δύο µεταβλητές αντί για µία In[14]:= Table@1 êhi + jl, 8i, 1, 3<, 8j, 1, 3<D êê MatrixForm Με το MatrixForm παρουσιάζουµε τα στοιχεία της λίστας σε µορφή µαθηµατικού πίνακα. Μαθηµατικών, Α.Π.Θ. 2
ηµιουργία Λίστας δ) τρόπος Με χρήση της εντολής Array In[15]:=? Array In[23]:= Array@f, 82, 2<D Άσκηση. Να δηµιουργήσετε τον πίνακα των ηµιτόνων-συνηµιτόνων-εφαπτοµένης για γωνίες µεταξύ 0 και 90 µοιρών. Άσκηση. Να δηµιουργήσετε τον πίνακα µε τους πυθαγόρειους αριθµούς αν γνωρίζετε ότι αυτοί δίνονται από τον τύπο a = m 2 n 2, b = 2 mn, c = m 2 + n 2, m > n για m=2,3,4,5,6 και n=1,2,3,4,5. ηµιουργία Λίστας Λύση άσκησης 1 In[30]:= Table@8x 180 ê Pi, Sin@xD, Cos@xD, Tan@xD<, 8x, 0, Pi ê2, Pi ê 2 ê 90<D êê N êê TableForm Λύση άσκησης 2 In[39]:= Table@8m 2 n 2,2 m n, m 2 + n 2 <, 8m, 2, 6<, 8n, 1, m 1<D êê TableForm Μαθηµατικών, Α.Π.Θ. 3
Στοιχεία που αφορούν την λίστα Έστω η λίστα στοιχείων In[40]:= a = 88x, 1<, 81, x<, 8x, 2<< Το σύνολο των στοιχείων της λίστας είναι In[41]:= Length@aD ενώ η διάσταση του πίνακα ο οποίος αναπαριστάται από την λίστα είναι In[43]:= Dimensions@aD Επιλογή στοιχείων της λίστας Έστω ότι έχουµε την λίστα In[53]:= a = Table@i^2, 8i, 1, 5<D και θέλουµε να πάρουµε το 3ο στοιχείο της λίστας. Τότε θα γράψουµε In[54]:= a@@3dd ή In[55]:= Part@a, 3D Μαθηµατικών, Α.Π.Θ. 4
Επιλογή στοιχείων της λίστας Έστω τώρα η λίστα In[56]:= b = Table@8i, i^2<, 8i, 1, 5<D και θέλω το 3ο στοιχείο της λίστας. Τότε θα έχω In[57]:= b@@3dd το οποίο είναι πάλι λίστα. Αν από αυτή τη λίστα θέλω το δεύτερο στοιχείο της θα έχω In[58]:= b@@3dd@@2dd Θα µπορούσα επίσης να γράψω αρχικά In[59]:= b@@3, 2DD ή In[64]:= Part@b, 3, 2D Επιλογή στοιχείων της λίστας Αν θέλω παραπάνω από ένα στοιχεία της λίστας π.χ. 2ο και 3ο στοιχείο της λίστας b θα έχουµε In[66]:= Part@b, 82, 3<D Αν πάλι θέλουµε να πάρουµε τον υποπίνακα που προκύπτει από την 2η και 3η γραµµή και την 2η στήλη θα έχουµε In[67]:= Part@b, 82, 3<, 82<D In[70]:=? Part Μαθηµατικών, Α.Π.Θ. 5
Επιλογή στοιχείων της λίστας Έστω τώρα η λίστα In[180]:= a = Table@Prime@iD, 8i, 1, 10<D Το πρώτο στοιχείο της λίστας είναι το a[[1]] ή το In[72]:= First@aD ενώ το τελευταίο στοιχείο είναι το a[[10]] ή το In[73]:= Last@aD Μπορούµε να πάρουµε την λίστα χωρίς το πρώτο στοιχείο της In[75]:= Rest@aD ή διαφορετικά In[76]:= Drop@a, 1D Επιλογή στοιχείων της λίστας ή διαφορετικά In[76]:= Drop@a, 1D Αν πάλι θέλουµε να αφαιρέσουµε το τελευταίο στοιχείο της λίστας θα έχουµε In[78]:= Drop@a, 1D ή αν θέλουµε να αφαιρέσουµε το 3ο και 4ο στοιχείο της λίστας θα έχουµε In[79]:= Drop@a, 83, 4<D In[80]:=? Drop Μαθηµατικών, Α.Π.Θ. 6
Επιλογή στοιχείων της λίστας Σε αντιδιαστολή µε την Drop έχουµε την Take η οποία παίρνει στοιχεία από µια λίστα και ακολουθεί την ίδια σύνταξη. Αν λοιπόν θέλουµε το 3ο και 4ο στοιχείο της λίστας θα έχουµε In[181]:= Take@a, 83, 4<D Μπορούµε επίσης να επιλέξουµε τα στοιχεία της λίστας που ικανοποιούν κάποιο κριτήριο π.χ. In[185]:= a = Table@i, 8i, 1, 50<D; In[186]:= Select@a, PrimeQD In[187]:= Select@a, EvenQD Επιλογή στοιχείων της λίστας Άσκηση. Να δηµιουργήσετε µια λίστα a1 µε τους φυσικούς αριθµούς 1,2,3,...,50. Στη συνέχεια να δηµιουργήσετε µια λίστα a2 που θα περιέχει τα στοιχεία της a1 εκτός από το 1ο, 3ο, 5ο,...,50ο. Στη συνέχεια να δηµιουργήσετε µια λίστα a3 που θα περιέχει τα στοιχεία της a2 εκτός από το 1ο, 3ο, 5ο,.... Να συνεχίσετε την διαδικασία αυτή εως ότου πάρετε µια λίστα µε ένα µόνο στοιχείο. Μαθηµατικών, Α.Π.Θ. 7
Επιλογή στοιχείων της λίστας Λύση άσκησης In[107]:= a1 = Table@i, 8i, 1, 50<D In[100]:= a2 = Drop@a1, 81, 50, 2<D In[101]:= a3 = Drop@a2, 81, Length@a2D, 2<D In[102]:= a4 = Drop@a3, 81, Length@a3D, 2<D In[103]:= a5 = Drop@a4, 81, Length@a4D, 2<D In[104]:= a6 = Drop@a5, 81, Length@a5D, 2<D Επιλογή στοιχείων της λίστας Άσκηση. Ένα σύνολο χαρακτήρων αποτελεί ένα string. Ο χειρισµός των string γίνεται µε αντίστοιχες συναρτήσεις που χρησιµοποιούµε για τις λίστες µε παρόµοια σύνταξη όπως StringLength, StringTake, StringDrop, StringPosition κ.λ.π. In[130]:=? String* Για την µετατροπή ενός string σε λίστα χαρακτήρων χρησιµοποιούµε την Characters[string]. Σε κάθε χαρακτήρα αντισοιχεί ένας κωδικός αριθµός από τον κώδικα ASCII. Η συνάρτηση ToCharacterCode µετατρέπει τον χαρακτήρα/string στους αντίστοιχους κωδικούς αριθµούς. Η αντίστροφη συνάρτηση είναι η FromCharacterCode. ίνεται η λέξη athena. Να µετατρέψεται τα γράµµατα της λέξης στους αντίστοιχους κωδικούς αριθµούς ASCII. Στη συνέχεια να αφαιρέσετε από όλους τους χαρακτήρες τον αριθµό 30 και να ξαναµετατρέψετε τους κωδικούς αριθµούς σε χαρακτήρες. Μαθηµατικών, Α.Π.Θ. 8
Επιλογή στοιχείων της λίστας Λύση της άσκησης In[160]:= a = "athena" In[161]:= b = ToCharacterCode@aD In[178]:= c = b 30 In[179]:= FromCharacterCode@cD Έλεγχος και αναζήτηση στοιχείων στη λίστα Θεωρείστε την παρακάτω λίστα In[122]:= Clear@a, bd In[123]:= a1 = 8n, i, k, o, s, k, a, r, a, m, p, e, t, a, k, i, s< και θέλουµε να εµφανίσουµε την θέση του στοιχείου "k". Τότε θα γράψουµε In[124]:= Position@a1, kd ενώ αν θέλουµε να εµφανίσουµε πόσες φορές εµφανίσθηκε το στοιχείο k στην λίστα θα γράψουµε Length[Position[a1,k]] ή In[125]:= Count@a1, kd Μαθηµατικών, Α.Π.Θ. 9
Έλεγχος και αναζήτηση στοιχείων στη λίστα Για να ελέγξουµε αν ένα στοιχείο π.χ. g, αποτελεί στοιχείο της λίστας θα πρέπει να γράψουµε In[127]:= MemberQ@a1, gd ή αντίθετα αν θέλουµε να ελέγξουµε αν ένα στοιχείο π.χ. g, δεν εµφανίζεται στη λίστα θα γράψουµε In[128]:= FreeQ@a1, gd In[129]:=?*Q Προσθήκη, αφαίρεση και µεταβολή στοιχείων σε µια λίστα Έστω In[189]:= Clear@a, b, c, d, ed In[2]:= a1 = 8b, c, e< Προσθήκη ενός στοιχείου στην αρχή της λίστας In[3]:= Prepend@a1, ad In[4]:= a1 Προσθήκη ενός στοιχείου στην αρχή της λίστας και αντικατάσταση της λίστας In[5]:= PrependTo@a1, ad In[6]:= a1 Μαθηµατικών, Α.Π.Θ. 10
Προσθήκη, αφαίρεση και µεταβολή στοιχείων σε µια λίστα Προσθήκη ενός στοιχείου στo τέλος της λίστας In[7]:= Append@a1, fd In[8]:= a1 Προσθήκη ενός στοιχείου στo τέλος της λίστας και αντικατάσταση της λίστας In[9]:= AppendTo@a1, fd Προσθήκη ενός στοιχείου σε συγκεκριµένη θέση της λίστας??? In[10]:= Insert@a1,d,4D In[11]:= a1 ιαγραφή ενός στοιχείου από τη λίστα In[12]:= Delete@a1, 5D Προσθήκη, αφαίρεση και µεταβολή στοιχείων σε µια λίστα Αντικατάσταση του πρώτου στοιχείου µε z In[14]:= ReplacePart@a1, z, 1D Άσκηση. Να δηµιουργηθεί ο πίνακας Α = i 1 2 y 3 4 k 5 6 { και στη συνέχεια να αντικατασταθεί η δεύτερη του γραµµή µε {2,3} και να διαγραφεί η 3η γραµµή. Μαθηµατικών, Α.Π.Θ. 11
Προσθήκη, αφαίρεση και µεταβολή στοιχείων σε µια λίστα Λύση της άσκησης In[15]:= a = 881, 2<, 83, 4<, 85, 6<< In[20]:= b = ReplacePart@a, 82, 3<, 2D In[19]:= c = Delete@b, 3D Συνδυασµός λιστών και χειρισµός συνόλων Έστω οι παρακάτω δύο λίστες In[24]:= Clear@a, b, c, d, ed In[26]:= a = 8b, c, d, e<; In[27]:= f = 8b, d, s, g<; Μπορούµε να συνενώσουµε τις λίστες In[28]:= Join@a, fd ή να τις ενώσουµε σύµφωνα µε την θεωρία συνόλων In[29]:= Union@a, fd Μαθηµατικών, Α.Π.Θ. 12
Συνδυασµός λιστών και χειρισµός συνόλων Μπορούµε να βρούµε τα σηµεία τοµής των δύο συνόλων In[31]:= Intersection@a, fd Θεωρείστε το σύνολο των φυσικών αριθµών από το 1 έως το 20 In[53]:= aa = Table@i, 8i, 1, 20<D και το σύνολο των πρώτων αριθµών που είναι µικρότεροι από 20 In[60]:= bb = Table@Prime@iD, 8i, 1, PrimePi@20D<D Τότε το σύνολο των αριθµών του aa συνόλου που δεν ανήκουν στο bb σύνολο είναι το ακόλουθο In[61]:= Complement@aa, bbd Αναδιάταξη και οµαδοποίηση των στοιχείων µιας λίστας Έστω οι βαθµοί στο µάθηµα "Συµβολικές Γλώσσες Προγραµµατισµού" ήταν οι εξής : In[62]:= a = 82, 3, 6, 7, 4, 3, 7, 3, 9, 10, 10, 2, 9, 9< και θέλουµε να ταξινοµήσουµε τα παραπάνω στοιχεία.τότε θα γράψουµε In[65]:= Sort@aD Αν πάλι θέλαµε να τα χωρίσουµε και σε οµάδες ίδιων στοιχείων θα γράφαµε In[66]:= Split@%D Αν πάλι θέλαµε να κρατήσουµε µόνο τους βαθµούς που εµφανίσθηκαν θα γράφαµε In[68]:= Union@aD Μαθηµατικών, Α.Π.Θ. 13
Αναδιάταξη και οµαδοποίηση των στοιχείων µιας λίστας Η αντιστροφή των παραπάνω στοιχείων γίνεται ως εξής In[69]:= Reverse@%D Ο χωρισµός των στοιχείων της λίστας σε οµάδες των δύο στοιχείων γίνεται ως εξής In[70]:= Partition@%, 2D Ο ανάστροφος του παραπάνω πίνακα δίνεται παρακάτω In[71]:= Transpose@%D ενώ η επαναφορά των στοιχείων της παραπάνω λίστας σε µια γραµµή γίνεται από την Flatten In[72]:= Flatten@%D Ασκήσεις για το σπίτι Άσκηση 1. (Υπολογισµός προσαρτηµένου πίνακα) ίνεται ο πίνακας Α = i 1 2 3 y 2 3 1 k 3 1 2 { Να δηµιουργήσετε τον προσαρτηµένο πίνακα του πίνακα Α i m 11 m 21 m 31 y M = m 12 m 22 m 32 k m 13 m 23 m 33 { όπου το m ij στοιχείο του πίνακα Μ προκύπτει από την ορίζουσα του πίνακα Α αν αφαιρέσουµε την γραµµή i και στήλη j. Μαθηµατικών, Α.Π.Θ. 14
Ασκήσεις για το σπίτι Άσκηση 2. (Κρυπτογραφία) Να πάρετε όλους τους χαρακτήρες από Α έως και Ζ σε µια λίστα a µε την συνάρτηση CharacterRange["A","Z"]. Στη συνέχεια να µετατρέψετε την παραπάνω λίστα σε αντίστοιχους κωδικούς ASCII. Σε κάθε αριθµό Α να αντιστοιχήσετε τον αριθµό [(5Α+4) mod 26]+65. Τέλος να µετατρέψετε τους καινούριους αριθµούς ASCII στα αντίστοιχα γράµµατα. Ασκήσεις για το σπίτι Άσκηση 3. (Μέθοδος υπολογισµού του π µε την µέθοδο Monte Carlo) ηµιούργησε µια λίστα µε k ζεύγη τυχαίων πραγµατικών αριθµών µεταξύ [0,1]. Στη συνέχεια χρησιµοποίησε την συνάρτηση f @x_real, y_reald := x 2 + y 2 1 και µε την βοήθεια της Select και της Count προσδιόρισε το πλήθος q των σηµείων που ικανοποιούν την παραπάνω ιδιότητα. Σύγκρινε τον αριθµό q/k που βρήκες µε το Pi/4. Eπανέλαβε την διαδικασία για k=10,100,1000,10000. Τι παρατηρείς ; Μαθηµατικών, Α.Π.Θ. 15