Többdimenziós adatszerkezet

Ha listába listát teszünk, akkor többdimenziós adatszerkezetet tudunk létrehozni.

1A Táblázatos, kétdimenziós adatszerkezet

         
1autok = [
2    ['Toyota', 'Corolla','japán'],
3    ['Mazda', '3','japán'],
4    ['Hyundai', 'i20','Korea'],
5    ['Audi', 'A6','Német'],
6    ['Ferrari', 'F50','Olasz'],
7    ['Renault', 'Clio','Francia'],
8    ['Ford', 'Focus','Amerika']
9    ]
10
11for auto in autok:
12    print('Márka:', auto[0], end=" ")
13    print('Típus:', auto[1], end=" ")
14    print('Ország:', auto[2])
1#include <iostream>
2#include <vector>
3#include <string>
4using namespace std;
5
6int main() {
7	vector<vector<string>> autok = {
8         {"Toyota", "Corolla", "japán"},
9         {"Mazda", "3", "japán"},
10         {"Hyundai", "i20", "Korea"},
11         {"Audi", "A6", "Német"},
12         {"Ferrari", "F50", "Olasz"},
13         {"Renault", "Clio", "Francia"},
14         {"Ford", "Focus", "Amerika"}
15         };
16
17 // C++ban az auto kulcsszó, ezért Auto lett a változónév
18    for (const auto& Auto : autok) {
19        cout << " Marka: " << Auto[0];
20        cout << " Tipus: " << Auto[1];
21        cout << " Orszag: " << Auto[2];
22        cout << endl;
23        }
24
25
26	return 0;
27}

1B Táblázatos, kétdimenziós látszólag asszociatív adatszerkezettel

         
1Marka=0
2Tipus=1
3Orszag=2
4autok = [
5    ['Toyota', 'Corolla','japán'],
6    ['Mazda', '3','japán'],
7    ['Hyundai', 'i20','Korea'],
8    ['Audi', 'A6','Német'],
9    ['Ferrari', 'F50','Olasz'],
10    ['Renault', 'Clio','Francia'],
11    ['Ford', 'Focus','Amerika']
12    ]
13
14for auto in autok:
15    print('Márka:', auto[Marka], end=" ")
16    print('Típus:', auto[Tipus], end=" ")
17    print('Ország:', auto[Orszag])
1#include <iostream>
2#include <vector>
3#include <string>
4using namespace std;
5
6int main() {
7    int Marka=0;
8    int Tipus=1;
9    int Orszag=2;
10	vector<vector<string>> autok = {
11         {"Toyota", "Corolla", "japán"},
12         {"Mazda", "3", "japán"},
13         {"Hyundai", "i20", "Korea"},
14         {"Audi", "A6", "Német"},
15         {"Ferrari", "F50", "Olasz"},
16         {"Renault", "Clio", "Francia"},
17         {"Ford", "Focus", "Amerika"}
18         };
19
20 // C++ban az auto egy kulcsszó, így azt nem használhatjuk változónévként
21	for (const auto& auto1 : autok) {
22		cout << "Marka: " << auto1[Marka];
23		cout << " Tipus: " << auto1[Tipus];
24		cout << " Orszag: " << auto1[Orszag];
25        cout << endl;
26        }
27
28	return 0;
29}

1C Táblázatos, kétdimenziós adatszerkezet külön változókkal kiíratva

         
1autok = [
2    ['Toyota', 'Corolla','japán'],
3    ['Mazda', '3','japán'],
4    ['Hyundai', 'i20','Korea'],
5    ['Audi', 'A6','Német'],
6    ['Ferrari', 'F50','Olasz'],
7    ['Renault', 'Clio','Francia'],
8    ['Ford', 'Focus','Amerika']
9    ]
10
11for marka, tipus, orszag in autok:
12    print('Márka:', marka, end=" ")
13    print('Típus:', tipus, end=" ")
14    print('Ország:', orszag)
1#include <iostream>
2#include <vector>
3#include <string>
4using namespace std;
5
6int main() {
7	vector<vector<string>> autok = {
8         {"Toyota", "Corolla", "japán"},
9         {"Mazda", "3", "japán"},
10         {"Hyundai", "i20", "Korea"},
11         {"Audi", "A6", "Német"},
12         {"Ferrari", "F50", "Olasz"},
13         {"Renault", "Clio", "Francia"},
14         {"Ford", "Focus", "Amerika"}
15         };
16
17 // C++17-nél korábbi verziókban nem működik.
18	for (const auto& [marka, tipus, orszag] : autok) {
19		cout << "Marka: " << marka;
20		cout << " Tipus: " << tipus;
21		cout << " Orszag: " << orszag;
22        cout << endl;
23        }
24
25	return 0;
26}

Az autók adatai egy-egy 3 elemű listában vannak elmentve, ahol sorrendben a Márka, Típus, Ország tulajdonságok vannak megadva. ha létrehozunk ezeknek megfelelő változókat, amelyek az indexszámokat tárolják, akkor beszédesebb változómegadást tudunk létrehozni. Az eredeti lista elemeit így lehet megjeleníteni:
autok[3][0] = autok[3][Marka] = Audi
autok[5][2] = autok[5][Orszag] = Francia

Az előbbi adatszerkezethez hozzáfűzés

Létrehozunk egy adatelemet (autót), majd bele tesszük az autok nevű listába

ujauto=['BMW','M8','Német']
autok.append(ujauto)

2A Táblázatos, kétdimenziós adatszerkezet beolvasása fáljból

Példafájl: Könyvek adatait pontosvesszővel tagoltan tartalmazó konyvek(ev (egész), negyedev (egész), eredet, leiras, peldanyszam (egész)) kiadas.txt nevű fájl.

A fájl minden sorában egy-egy könyv kiadására vonatkozó adatok szerepelnek:
a kiadás ideje (év és negyedév), a könyv eredete (ma = magyar, kf = külföldi), a mű leírása, valamint a kiadott példányszám.

Soron belül a felsorolt adatokat pontosvessző választja el egymástól.

         
1kiadasok=[]
2
3f = open("kiadas.txt","r", encoding="utf-8")
4
5for sor in f:
6    sor = sor.strip() # felesleges láthatatlan karakterek eltávolítása a sor elejéről és a végéről (pl. szóköz, sortörés karakter)
7    if sor=="":
8        continue # üres sorok figyelmen kívül hagyása
9    kiadas = sor.split(';') # sor szöveg feldarabolása és listává alakítása
10    kiadas[0] = int(kiadas[0]) # év egésszé alakítása
11    kiadas[1] = int(kiadas[1]) # negyedév egésszé alakítása
12    kiadas[4] = int(kiadas[4]) # példányszám egésszé alakítása
13    kiadasok.append(kiadas) # a kiadások lista feltöltése a kiadas nevű tagolt, átalakított listával
14
15f.close()
16
17for kiadas in kiadasok:
18    print(kiadas)

2B Ugyanez beszédes kulcsokkal, kommentek nélkül.

Lépések: fájlkezelés, ciklus a soronkénti bejáráshoz, strip() kitörli a láthatatlan sorvég karaktereket, üres sorok átugrása a hibák elkerülése érdekében, sorok feldarabolása és ha szükséges, átalakítása, kiadas lista feltöltése, végül kiíratás.

         
1ev = 0
2negyedev = 1
3eredet = 2
4leiras = 3
5peldanyszam = 4
6kiadasok=[]
7
8f = open("kiadas.txt","r", encoding="utf-8")
9
10for sor in f:
11    sor = sor.strip()
12    if sor=="":
13        continue
14    kiadas = sor.split(';')
15    kiadas[ev] = int(kiadas[ev])
16    kiadas[negyedev] = int(kiadas[negyedev])
17    kiadas[peldanyszam] = int(kiadas[peldanyszam])
18    kiadasok.append(kiadas)
19
20f.close()
21
22for kiadas in kiadasok:
23    print(kiadas)
1#include <iostream>
2#include <fstream>
3#include <sstream>
4#include <vector>
5#include <string>
6using namespace std;
7
8string strip(string szoveg) {
9	int start = szoveg.find_first_not_of(" \t\r\n");
10	if (start == string::npos) return "";
11	int end = szoveg.find_last_not_of(" \t\r\n");
12	return szoveg.substr(start, end - start + 1);
13	}
14
15struct Kiadas {
16    int ev;
17    int negyedev;
18    string tipus;
19    string kiado;
20    int peldanyszam;
21	};
22
23int main() {
24    vector<Kiadas> kiadasok;
25    ifstream f("kiadas.txt");
26
27    string sor;
28    while (getline(f, sor)) {
29		sor = strip(sor);
30        if (sor.empty())
31            continue;
32        stringstream ss(sor);
33        Kiadas k;
34        string temp;
35
36        getline(ss, temp, ';'); k.ev = stoi(temp);
37        getline(ss, temp, ';'); k.negyedev = stoi(temp);
38        getline(ss, temp, ';'); k.tipus = temp;
39        getline(ss, temp, ';'); k.kiado = temp;
40        getline(ss, temp, ';'); k.peldanyszam = stoi(temp);
41        kiadasok.push_back(k);
42		}
43
44    f.close();
45
46    for (const auto& kiadas : kiadasok) {
47        cout << kiadas.ev << " "
48             << kiadas.negyedev << " "
49             << kiadas.tipus << " "
50             << kiadas.kiado << " "
51             << kiadas.peldanyszam << endl;
52    }
53
54    return 0;
55}

Tehát a fájlból adatszerkezetbe történő átalakítás lépései:

  1. beolvasás soronként,
  2. adatsorok feldarabolása és listává alakítása,
  3. egyes adatok átalakítása számmá,
  4. adatsorokat tartalmazó listák eltárolása egy nagy listában.

Ha a beolvasandó fájl első sora tartalmaz mezőneveket, vagy bármi más információt, akkor a for ciklus előtt például egy head = f.readline()utasítással átléphetjük az első sort.

3 Táblázatos, kétdimenziós adatszerkezet beolvasása fáljból mezőnevekkel

Példafájl: kerulet(szam, nev, lakossag (egész), terulet (valós)) tabulatorral tagoltan tartalmazó kiadas.txt nevű fájl.

         
1keruletek=[]
2f = open("kerulet.txt","r", encoding="utf-8")
3head = f.readline()
4
5for sor in f:
6    sor = sor.strip()
7    if sor=="":
8        continue
9    ker = sor.split("\t") # tabulátorral tagolás
10    ker[2]=int(ker[2])
11    ker[3]=ker[3].replace(",", ".") # tizedes vessző tizedes ponttá alakítása
12    ker[3]=float(ker[3])
13    keruletek.append(ker)
14
15f.close()
16
17for kerulet in keruletek:
18    print(kerulet)

Ebben a feladatban külön érdemes megnézni a tabulátorral tagolást és valós, tizedes pontos számmá alakítást!