Listák, halmazok, szótárak, vektorok, mátrixok

{{{id=68| # Lista: szögletes zárójel L = [4, 5, 6] /// }}} {{{id=54| L[0], L[1], L[2], L[3] /// Traceback (most recent call last): File "", line 1, in File "_sage_input_20.py", line 10, in exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("TFswXSwgTFsxXSwgTFsyXSwgTFszXQ=="),globals())+"\\n"); execfile(os.path.abspath("___code___.py"))' + '\n', '', 'single') File "", line 1, in File "/private/var/folders/7b/4d7y24z51dl48754cr6_kr900000gn/T/tmptlTAzU/___code___.py", line 3, in exec compile(u'L[_sage_const_0 ], L[_sage_const_1 ], L[_sage_const_2 ], L[_sage_const_3 ]' + '\n', '', 'single') File "", line 1, in IndexError: list index out of range }}} {{{id=69| L[-1] /// 6 }}} {{{id=70| L[2] = 17 L[-1] /// 17 }}} {{{id=71| L += [100, 200, 300] L /// [4, 5, 17, 100, 200, 300] }}} {{{id=72| L[0:3] /// [4, 5, 17] }}}

Listák létrehozása

Hosszabb listáknál a range parancs vagy a for kulcsszó segíthet, ld. a példákat

{{{id=73| L = range(1, 10) L /// [1, 2, 3, 4, 5, 6, 7, 8, 9] }}} {{{id=74| L = [1..10] L /// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] }}} {{{id=76| L = [i^2 for i in range(1, 11)] L /// [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] }}} {{{id=77| L2 = [i-1 for i in L] L2 /// [0, 3, 8, 15, 24, 35, 48, 63, 80, 99] }}} {{{id=78| # Ha több 'for' van, nem kommutatív! [(i, j) for i in range(1, 5) for j in range(i, i+2)] /// [(1, 1), (1, 2), (2, 2), (2, 3), (3, 3), (3, 4), (4, 4), (4, 5)] }}} {{{id=93| # A for mellé if-fel adhatunk plusz feltételeket L = [i for i in range(1, 40) if is_prime(i)] L /// [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37] }}} {{{id=117| 17 in L /// True }}} {{{id=119| # Hol fordul elő először? L.index(17) /// 6 }}} {{{id=116| sum(L) /// 197 }}} {{{id=94| # Logikai 'and', 'or', 'not' L = [i for i in range(1, 20) if not is_prime(i)] L /// [1, 4, 6, 8, 9, 10, 12, 14, 15, 16, 18] }}} {{{id=80| # Listák listája L = [ [i, i+1, i+2] for i in [12, 100, 117627] ] L /// [[12, 13, 14], [100, 101, 102], [117627, 117628, 117629]] }}} {{{id=85| len(L) /// 3 }}}

Lista: egy elem többször is, sorrend fontos. Halmaz: ahogy matematikában szokásos.

{{{id=81| X = Set([1, 2, 3]) X /// {1, 2, 3} }}} {{{id=86| X = Set([2, 3, 1, 1, 2, 3, 2, 3, 1]) X /// {1, 2, 3} }}} {{{id=83| # Halmazok halmaza Y = Set([ X, 1, Set([]) ]) Y /// {1, {1, 2, 3}, {}} }}} {{{id=84| # Listák halmaza: nem működik X = Set([ [1, 2, 4], [1, 5, 7] ]) /// Traceback (most recent call last): File "", line 1, in File "_sage_input_42.py", line 10, in exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("IyBMaXN0w6FrIGhhbG1hemE6IG5lbSBtxbFrw7ZkaWsKWCA9IFNldChbIFsxLCAyLCA0XSwgWzEsIDUsIDddIF0p"),globals())+"\\n"); execfile(os.path.abspath("___code___.py"))' + '\n', '', 'single') File "", line 1, in File "/private/var/folders/7b/4d7y24z51dl48754cr6_kr900000gn/T/tmp9IxknR/___code___.py", line 3, in exec compile(u'X = Set([ [_sage_const_1 , _sage_const_2 , _sage_const_4 ], [_sage_const_1 , _sage_const_5 , _sage_const_7 ] ])' + '\n', '', 'single') File "", line 1, in File "/Applications/SageMath/local/lib/python2.7/site-packages/sage/sets/set.py", line 146, in Set return Set_object_enumerated(frozenset(X)) TypeError: unhashable type: 'list' }}} {{{id=87| # Ún. tuple típussal megy. X = Set([ (1, 2, 4), (1, 5, 7) ]) X /// {(1, 5, 7), (1, 2, 4)} }}} {{{id=90| X = Set([ 1, 2, 3 ]) Y = Set([ 1, 3, 5 ]) X.intersection(Y) /// {1, 3} }}}

A 'dictionary' típusban minden halmazelemhez (kulcs, key) tartozik egy érték (value). Más nyelvben: hash map, tábla stb.

{{{id=91| d = {1: 17, "apple": "jobs", Set([1, 2]): 8, (1, 3, 8): -2+I} /// }}} {{{id=95| d[1], d["apple"], d[1, 3, 8] /// (17, 'jobs', I - 2) }}} {{{id=98| d[2] /// Traceback (most recent call last): File "", line 1, in File "_sage_input_47.py", line 10, in exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("ZFsyXQ=="),globals())+"\\n"); execfile(os.path.abspath("___code___.py"))' + '\n', '', 'single') File "", line 1, in File "/private/var/folders/7b/4d7y24z51dl48754cr6_kr900000gn/T/tmpRpKu25/___code___.py", line 3, in exec compile(u'd[_sage_const_2 ]' + '\n', '', 'single') File "", line 1, in KeyError: 2 }}} {{{id=99| 2 in d /// False }}}

Típuskonverzió

{{{id=88| L = [1, 2, 3] T = (10, 20, 30) S = Set([-1, -2, -3]) /// }}} {{{id=96| tuple(S) /// (-1, -2, -3) }}} {{{id=101| list(T) /// [10, 20, 30] }}} {{{id=108| s = str(T) s /// '(10, 20, 30)' }}} {{{id=109| s[0:8] /// '(10, 20,' }}} {{{id=110| s[5:7] /// '20' }}} {{{id=111| int(_)^2 /// 400 }}}

Vektorok, mátrixok

{{{id=103| v = vector([1, 2, 3]) M = matrix([[4, 5, 6], [7, 8, 9], [10, 11, 12]]) M, v /// ( [ 4 5 6] [ 7 8 9] [10 11 12], (1, 2, 3) ) }}} {{{id=120| # Mátrixok létrehozása listák listájával: M2 = matrix([ [2^i + j for j in [0..9]] for i in [0..9] ]) M2 /// [ 1 2 3 4 5 6 7 8 9 10] [ 2 3 4 5 6 7 8 9 10 11] [ 4 5 6 7 8 9 10 11 12 13] [ 8 9 10 11 12 13 14 15 16 17] [ 16 17 18 19 20 21 22 23 24 25] [ 32 33 34 35 36 37 38 39 40 41] [ 64 65 66 67 68 69 70 71 72 73] [128 129 130 131 132 133 134 135 136 137] [256 257 258 259 260 261 262 263 264 265] [512 513 514 515 516 517 518 519 520 521] }}} {{{id=123| # Mátrix megadása egy listával és a méretekkel M3 = matrix(10, 10, range(100, 300, 2)) M3 /// [100 102 104 106 108 110 112 114 116 118] [120 122 124 126 128 130 132 134 136 138] [140 142 144 146 148 150 152 154 156 158] [160 162 164 166 168 170 172 174 176 178] [180 182 184 186 188 190 192 194 196 198] [200 202 204 206 208 210 212 214 216 218] [220 222 224 226 228 230 232 234 236 238] [240 242 244 246 248 250 252 254 256 258] [260 262 264 266 268 270 272 274 276 278] [280 282 284 286 288 290 292 294 296 298] }}} {{{id=124| # Mátrix megadása szabállyal M4 = matrix(10, 10, lambda i,j: 2^i + j) M4 /// [ 1 2 3 4 5 6 7 8 9 10] [ 2 3 4 5 6 7 8 9 10 11] [ 4 5 6 7 8 9 10 11 12 13] [ 8 9 10 11 12 13 14 15 16 17] [ 16 17 18 19 20 21 22 23 24 25] [ 32 33 34 35 36 37 38 39 40 41] [ 64 65 66 67 68 69 70 71 72 73] [128 129 130 131 132 133 134 135 136 137] [256 257 258 259 260 261 262 263 264 265] [512 513 514 515 516 517 518 519 520 521] }}} {{{id=102| M * v /// (32, 50, 68) }}} {{{id=105| M.determinant(), M.trace() /// (0, 24) }}} {{{id=106| v * M /// (48, 54, 60) }}} {{{id=107| M^10 /// [15469254856944 17605113244128 19740971631312] [24321237539040 27679299686496 31037361833952] [33173220221136 37753486128864 42333752036592] }}} {{{id=113| latex(M^2) /// \left(\begin{array}{rrr} 111 & 126 & 141 \\ 174 & 198 & 222 \\ 237 & 270 & 303 \end{array}\right) }}}

Feladatok

1. Hozzunk létre egy listát az első 100 prímszámból (nth_prime). Számítsuk ki az összegüket.

2. Keressük meg a [10^6, 10^6+10^4] intervallum olyan $p$ prímjeit, melyekre $p+2$ is prím.

3. Legyen $n=1000$. Halmazokkal határozzuk meg, hány egész szám van a [0, n] intervallumban, mely sem 2-vel, sem 3-mal, sem 5-tel nem osztható.

4. Készítsünk 20 hosszú listát, melyben az i-edik helyen 1+2+...+i található. 

5. Hozzunk létre egy 10x10-es mátrixot, melyben $M_{ij} = i+j-1$.

6. Hozzunk létre egy 10x10-es mátrixot, melyben 1-től 100-ig vannak a számok sorfolytonosan.

7. Hozzunk létre egy 5x5-ös Vandermonde-mátrixot, számítsuk ki és bontsuk elsőfokú tényezőkre a determinánsát. (Hint: kezdjük azzal, hogy var('a', 'b', 'c', 'd', 'e').)

8. Hogyan alakíthatunk át egy L listát úgy, hogy minden eleme kétszer szerepeljen (pl. [a, b, c] átalakítva [a, a, b, b, c, c])?

És ha azt várjuk, hogy minden elem helyett az elembl képzett kételemlista szerepeljen? (pl. [[a, a], [b, b], [c, c])? 

9. Készítsünk egy listát 30 véletlen kockadobás értékéből (ld. randint?)

10*. Készítsünk 100 kísérletből álló listát, melynek mindegyik eleme egy 30-as dobássorozat az előző feladatból. Számoljuk meg, hogy hány olyan van, amiben a dobások összege osztható 5-tel. Mi lehet a pontos valószínűsége, hogy 30 kockával dobva az összeg 5-tel osztható? 

11.* Szimuláljunk 30 pénzérmével végzett dobásokat (mondjuk 100 kísérlet). Számoljuk össze, a 100 esetből hányszor jött ki pontosan 0, 1, 2, ..., 30 db. fej (egy 31-es gyakorisági listában). 

12.** Hányat kell átlagosan dobni egy szabályos dobókockával, hogy kijöjön az első 6-os? Genreráljunk dobássorozatokat listaként, keressük meg bennük az első 6-ost (L.index(6), ha L egy dobássorozat), és átlagoljuk (sum: összegzés).

13.** Ábrázoljuk a síkon a $\{\sum_{j=0}^k (-1+i)^jd_j \mid d_j \in \{0, 1\} \}$ ponthalmazt, ha $k=5$. (Ábrázolás: point paranccsal, pl. ld. point([ [i, j] for i in [1..8] for j in [i+2..2*i]])      .)

{{{id=121| point([ [i, j] for i in [1..8] for j in [i+2..2*i]]) /// }}} {{{id=125| /// }}}