A Pythonban a tuple egy megváltoztathatatlan, sorrendben tárolt elemekből álló gyűjtemény.
A legtöbb gyűjteményhez hasonlóan a tuples bármilyen (vagy többféle) adattípust tárolhat, más tuples-öket is beleértve.
A tuples minden általános sorozatműveletet támogat, a módosítható sorozatműveleteket viszont nem.
A tuple elemein a for item in <tuple> szerkezettel lehet végigiterálni.
Ha az elem indexére és értékére is szükség van, a for index, item in enumerate(<tuple>) használható.
Mint minden sorozatnál, a tuples elemei zárójeles jelöléssel érhetők el, balról egy 0-based index számmal vagy jobbról egy -1-based index számmal.
A tuple-ök egészben vagy részben szeletjelöléssel (<tuple>[<start>:<stop>:<step>]) is másolhatók.
A tuple-ök többféleképpen létrehozhatók: a tuple(<iterable>) osztálykonstruktorral vagy a tuple literál deklarációval.
tuple() konstruktor használata üresen vagy iterálható argumentummal:>>> no_elements = tuple()
()
# The constructor *requires* an iterable, so single elements must be passed in a list or another tuple.
>>> one_element = tuple([16])
(16,)
A stringek iterálhatók, ezért ha egyetlen str-t adsz a tuple() konstruktor argumentumaként, az meglepő eredményeket hozhat:
# String elements (characters) are iterated through and added to the tuple
>>> multiple_elements_string = tuple("Timbuktu")
('T', 'i', 'm', 'b', 'u', 'k', 't', 'u')
Egyetlen iterálható elem esetén az elemek egyenként adódnak hozzá:
>>> multiple_elements_list = tuple(["Parrot", "Bird", 334782])
("Parrot", "Bird", 334782)
>>> multiple_elements_set = tuple({2, 3, 5, 7, 11})
(2,3,5,7,11)
Mivel a tuple(<iterable>) konstruktor csak iterálhatókat (vagy semmit) fogad el argumentumként, sokkal egyszerűbb egy egyelemű tuple-t a literál módszerrel létrehozni.
>>> no_elements = ()
()
>>> one_element = ("Guava",)
("Guava",)
Egymásba ágyazott adatszerkezetek is szerepelhetnek tuple elemekként, beleértve a többi tuples-t is:
>>> nested_data_structures = ({"fish": "gold", "monkey": "brown", "parrot" : "grey"}, ("fish", "mammal", "bird"))
({"fish": "gold", "monkey": "brown", "parrot" : "grey"}, ("fish", "mammal", "bird"))
>>> nested_data_structures_1 = (["fish", "gold", "monkey", "brown", "parrot", "grey"], ("fish", "mammal", "bird"))
(["fish", "gold", "monkey", "brown", "parrot", "grey"], ("fish", "mammal", "bird"))
A tuple-ök összefűzhetők a plusz + operátorral, amely kibontja az egyes tuple-öket, és létrehoz egy új, egyesített tuple-t.
>>> new_via_concatenate = ("George", 5) + ("cat", "Tabby")
("George", 5, "cat", "Tabby")
#likewise, using the multiplication operator * is the equivalent of using + n times
>>> first_group = ("cat", "dog", "elephant")
>>> multiplied_group = first_group * 3
('cat', 'dog', 'elephant', 'cat', 'dog', 'elephant', 'cat', 'dog', 'elephant')
Egy tuple elemei zárójeles jelöléssel érhetők el, balról egy 0-based index számmal vagy jobbról egy -1-based index számmal.
student_info = ("Alyssa", "grade 3", "female", 8 )
#gender is at index 2 or index -2
>>> student_gender = student_info[2]
'female'
>>> student_gender = student_info[-2]
'female'
#name is at index 0 or index -4
>>> student_name = student_info[0]
Alyssa
>>> student_name = student_info[-4]
Alyssa
Egy tuple elemein ciklusban a for item in <tuple> szintaxissal lehet végigiterálni.
Ha az indexekre és az értékekre is szükség van, a for index, item in enumerate(<tuple>) használható.
>>> student_info = ("Alyssa", "grade 3", "female", 8 )
>>> for item in student_info:
... print(item)
...
Alyssa
grade 3
female
8
>>> for index, item in enumerate(student_info):
... print("Index is: " + str(index) + ", value is: " + str(item) +".")
...
Index is: 0, value is: Alyssa.
Index is: 1, value is: grade 3.
Index is: 2, value is: female.
Index is: 3, value is: 8.
Az in operátorral ellenőrizhető, hogy egy elem benne van-e egy tuple-ben.
>>> multiple_elements_list = tuple(["Parrot", "Bird", 334782])
("Parrot", "Bird", 334782)
>>> "Parrot" in multiple_elements_list
True
Azara és Rui csapattársak, akik egy kalóztémájú kincsvadászaton versenyeznek. Az egyiküknél a kincsek listája van térképkoordinátákkal, a másikuknál a helyszínnevek listája térképkoordinátákkal. Ezenkívül üres térképeket is kaptak, amelyeken egy kiindulópont van megjelölve: ITT VAGY.
| Azara listája | Rui listája | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
De a dolgok kissé rendezetlenek: Azara koordinátái látszólag máshogy vannak formázva és rendezve, mint Ruiéi, és folyton egyik listáról a másikra kell pillantaniuk, hogy kitalálják, melyik kincs melyik helyszínhez tartozik. Mivel feltörekvő pythonisták, hozzád fordultak segítségért, hogy írj egy kis programot (valójában függvények egy csoportját), amellyel jobban rendszerezhetik a vadászat adatait.
Valósítsd meg a get_coordinate() függvényt, amely átvesz egy (treasure, coordinate) párt Azara listájáról, és csak a kinyert térképkoordinátát adja vissza.
>>> get_coordinate(('Scrimshawed Whale Tooth', '2A'))
2A
Valósítsd meg a convert_coordinate() függvényt, amely átvesz egy "2A" formátumú koordinátát, és egy ("2", "A") formátumú tuple-t ad vissza.
>>> convert_coordinate("2A")
("2", "A")
Valósítsd meg a compare_records() függvényt, amely átvesz egy (treasure, coordinate) párt és egy (location, coordinate, quadrant) rekordot, majd összehasonlítja a bennük lévő koordinátákat.
Add vissza a True értéket, ha a koordináták „egyeznek”, és a False értéket, ha nem.
A pontos összehasonlításhoz formázd újra a koordinátákat, ahogy szükséges.
>>> compare_records(('Brass Spyglass', '4B'), ('Seaside Cottages', ('1', 'C'), 'blue'))
False
>>> compare_records(('Model Ship in Large Bottle', '8A'), ('Harbor Managers Office', ('8', 'A'), 'purple'))
True
Valósítsd meg a create_record() függvényt, amely átvesz egy (treasure, coordinate) párt Azara listájáról és egy (location, coordinate, quadrant) rekordot Rui listájáról, majd visszaadja a (treasure, coordinate, location, coordinate, quadrant) értéket ha a koordináták egyeznek.
Ha a koordináták nem egyeznek, add vissza a "not a match" szöveget.
A pontos összehasonlításhoz formázd újra a koordinátát, ahogy szükséges.
>>> create_record(('Brass Spyglass', '4B'), ('Abandoned Lighthouse', ('4', 'B'), 'Blue'))
('Brass Spyglass', '4B', 'Abandoned Lighthouse', ('4', 'B'), 'Blue')
>>> create_record(('Brass Spyglass', '4B'), ('Seaside Cottages', ('1', 'C'), 'blue'))
"not a match"
Tisztítsd meg Azara és Rui összevont rekordjait úgy, hogy rekordonként csak egy koordinátakészlet maradjon. Készíts jelentést, hogy egyetlen listában lássák mindazt, amit fel kell vinniük a térképeikre.
Valósítsd meg a clean_up() függvényt, amely átvesz egy tuple-ökből álló tuple-t (mindent mindkét listáról), végigmegy a külső tuple-ön, elhagyja a nem kívánt koordinátákat minden egyes belső tuple-ből, és mindegyiket hozzáadja egy 'report'-hoz.
Formázd és add vissza a 'report'-ot úgy, hogy minden sorban egy megtisztított rekord legyen.
>>> clean_up((('Brass Spyglass', '4B', 'Abandoned Lighthouse', ('4', 'B'), 'Blue'), ('Vintage Pirate Hat', '7E', 'Quiet Inlet (Island of Mystery)', ('7', 'E'), 'Orange'), ('Crystal Crab', '6A', 'Old Schooner', ('6', 'A'), 'Purple')))
"""
('Brass Spyglass', 'Abandoned Lighthouse', ('4', 'B'), 'Blue')\n
('Vintage Pirate Hat', 'Quiet Inlet (Island of Mystery)', ('7', 'E'), 'Orange')\n
('Crystal Crab', 'Old Schooner', ('6', 'A'), 'Purple')\n
"""
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Python nyelvet 17 fogalom146 feladat segítségével, valódi emberi mentorálással, mindez ingyen.