Python Tuple vs List: Ομοιότητες και διαφορές, Επεξήγηση

Σε αυτόν τον οδηγό, θα μάθετε τις ομοιότητες και τις διαφορές μεταξύ των πλειάδων και των λιστών Python. Θα καταλάβετε επίσης πότε πρέπει να χρησιμοποιήσετε πλειάδα.

Η λίστα και οι πλειάδες είναι και οι δύο ενσωματωμένες δομές δεδομένων στην Python. Μπορούν να χρησιμοποιηθούν για την αποθήκευση μιας συλλογής στοιχείων.

Από την υποστήριξη για την ευρετηρίαση και τον τεμαχισμό έως τον περιορισμό ετερογενών τύπων δεδομένων, οι πλειάδες και οι λίστες μπορεί να φαίνεται ότι έχουν παρόμοια λειτουργικότητα. Επομένως, η κατανόηση των ομοιοτήτων και των διαφορών μεταξύ των δύο μπορεί να σας βοηθήσει να αποφασίσετε ποια δομή δεδομένων θα χρησιμοποιήσετε.

Ας ξεκινήσουμε.

👩🏽‍💻 Μπορείτε να ξεκινήσετε ένα Python REPL και να ακολουθήσετε αυτό το σεμινάριο. Μπορείτε επίσης να χρησιμοποιήσετε τον διαδικτυακό επεξεργαστή Python του grtechpc.org για να κωδικοποιήσετε.

Python Tuple vs List: Ποιες είναι οι ομοιότητες;

Ας ξεκινήσουμε μαθαίνοντας τις ομοιότητες μεταξύ λιστών και πλειάδων. Για να διευκολύνουμε την καλύτερη εκμάθηση, παρουσιάζουμε παραδείγματα τόσο λιστών όσο και πλειάδων.

#1. Python Iterables

Στην Python, οι λίστες περικλείονται σε ένα ζευγάρι αγκύλες, ενώ οι πλειάδες περικλείονται σε παρενθέσεις. Μπορείτε επίσης να δημιουργήσετε μια πλειάδα ως ένα σύνολο τιμών που χωρίζονται με κόμμα-χωρίς τις παρενθέσεις.

Είναι και τα δύο επαναλαμβανόμενα. ώστε να μπορείτε να κάνετε βρόχο μέσα από αυτά χρησιμοποιώντας έναν βρόχο for.

Το κελί κώδικα παρακάτω δείχνει τον τρόπο επανάληψης μέσω μιας λίστας.

nums = [2,6,7,10]
print(f"Type of nums is {type(nums)}")
for num in nums:
  print(num)

# Output
Type of nums is <class 'list'>
2
6
7
10

Όπως εξηγείται παρακάτω, μπορείτε επίσης να κάνετε επανάληψη μέσω μιας πλειάδας χρησιμοποιώντας έναν βρόχο

nums = (2,6,7,10)

# Note: nums = 2,6,7,10 is a valid tuple as well. If needed, run a quick check!

print(f"Type of nums is {type(nums)}")
for num in nums:
  print(num)

# Output
Type of nums is <class 'tuple'>
2
6
7
10

#2. Υποστήριξη για δημιουργία από άλλες ακολουθίες

Η επόμενη ομοιότητα μεταξύ λιστών και πλειάδων είναι ότι μπορούν να δημιουργηθούν από υπάρχουσες ακολουθίες, όπως συμβολοσειρές.

sample_str = "Coding!"

Το ακόλουθο κελί κώδικα δείχνει πώς η λίστα(string) επιστρέφει μια λίστα, της οποίας τα στοιχεία λίστας είναι οι χαρακτήρες της συμβολοσειράς.

list_from_str = list(sample_str)
print(list_from_str)

# Output
['C', 'o', 'd', 'i', 'n', 'g', '!']

Ομοίως, μια πλειάδα μπορεί να δημιουργηθεί από μια συμβολοσειρά ή άλλη ακολουθία χρησιμοποιώντας πλειάδα(ακολουθία). Το κελί κώδικα παρακάτω δείχνει πώς μπορείτε να το κάνετε.

tuple_from_str = tuple(sample_str)
print(tuple_from_str)

# Output
('C', 'o', 'd', 'i', 'n', 'g', '!')

#3. Υποστήριξη για ευρετηρίαση και τεμαχισμό

Η Python υποστηρίζει μηδενική ευρετηρίαση στην οποία το πρώτο στοιχείο βρίσκεται στο δείκτη μηδέν, το δεύτερο στο δείκτη ένα και ούτω καθεξής. Η Python υποστηρίζει επίσης αρνητική ευρετηρίαση, όπου το τελευταίο στοιχείο βρίσκεται στον δείκτη -1, το στοιχείο από το δεύτερο προς το τελευταίο βρίσκεται στον δείκτη -2 και ούτω καθεξής.

list_from_str = ['C', 'o', 'd', 'i', 'n', 'g', '!']
print(list_from_str[1])
# o

Το στοιχείο στον δείκτη -2 είναι το δεύτερο προς το τελευταίο στοιχείο, «g».

tuple_from_str = ('C', 'o', 'd', 'i', 'n', 'g', '!')
print(tuple_from_str[-2])
# g

Μπορείτε να χρησιμοποιήσετε το slicing όταν θέλετε να εργαστείτε με ένα μικρό τμήμα της λίστας ή πλειάδα. λίστα[start:end] επιστρέφει ένα τμήμα της λίστας που ξεκινά από την αρχή του ευρετηρίου και επεκτείνεται μέχρι το τέλος – 1. Η προεπιλεγμένη τιμή για μια αρχή είναι 0 και το τέλος είναι το τελευταίο στοιχείο στον επαναληπτικό.

  Διορθώστε το Google Voice Δεν μπορέσαμε να ολοκληρώσουμε την κλήση σας

Μπορείτε να κόψετε πλειάδες χρησιμοποιώντας την ίδια σύνταξη. Ας δημιουργήσουμε κομμάτια της λίστας και πλειάδα που δημιουργήσαμε νωρίτερα.

list_from_str = ['C', 'o', 'd', 'i', 'n', 'g', '!']
print(list_from_str[0:5])

['C', 'o', 'd', 'i', 'n']

Εκτός από τις τιμές έναρξης και λήξης, μπορείτε επίσης να καθορίσετε μια τιμή βήματος. tuple(start:end:step) επιστρέφει ένα κομμάτι της πλειάδας από την αρχή μέχρι το τέλος – 1, στα βήματα του βήματος.

tuple_from_str = ('C', 'o', 'd', 'i', 'n', 'g', '!')
print(tuple_from_str[::2])

('C', 'd', 'n', '!')

Εδώ, ορίσαμε την τιμή βήματος σε 2. Άρα η φέτα περιέχει κάθε δεύτερο στοιχείο.

#4. Συλλογές πολλαπλών τύπων δεδομένων

Στα παραδείγματα που εξετάσαμε, όλα τα στοιχεία στη λίστα και οι πλειάδες ήταν του ίδιου τύπου δεδομένων.

Ωστόσο, μπορείτε να αποθηκεύσετε τιμές διαφορετικών τύπων δεδομένων σε μια ενιαία λίστα ή μια πλειάδα.

Το απόσπασμα κώδικα κάτω από το student_list περιέχει το όνομα ενός μαθητή ως συμβολοσειρά, την ηλικία ως ακέραιο και τα σημάδια ασφαλισμένα ως float.

student_list = ["John",22,96.5]
for item in student_list:
  print(f"{item} is of type {type(item)}")

# Output
John is of type <class 'str'>
22 is of type <class 'int'>
96.5 is of type <class 'float'>

Μπορούμε να βρούμε ένα παρόμοιο παράδειγμα για μια πλειάδα.

student_tuple = ("Jane",23,99.5)
for item in student_tuple:
  print(f"{item} is of type {type(item)}")

# Output
Jane is of type <class 'str'>
23 is of type <class 'int'>
99.5 is of type <class 'float'>

#5. Υποστήριξη για Δοκιμές Μέλους

Τόσο οι λίστες όσο και οι πλειάδες σάς επιτρέπουν να πραγματοποιείτε έλεγχο ιδιότητας μέλους για την παρουσία ορισμένων στοιχείων. Εάν θέλετε να ελέγξετε εάν ένα συγκεκριμένο στοιχείο υπάρχει σε μια λίστα ή μια πλειάδα, μπορείτε να χρησιμοποιήσετε τον τελεστή in.

Το στοιχείο έκφρασης στο iterable αξιολογείται σε True εάν το iterable περιέχει το στοιχείο. άλλο, Λάθος.

"Alex" in student_list
# False

"Jane" in student_tuple
# True

Μέχρι στιγμής, έχετε μάθει τις ομοιότητες μεταξύ λιστών και πλειάδων στην Python. Στη συνέχεια, ας μάθουμε τις βασικές διαφορές μεταξύ των δύο δομών δεδομένων.

Python Tuple vs List: Ποιες είναι οι διαφορές;

#1. Μεταβλητότητα λιστών και αμετάβλητη πλειάδα στην Python

Η πιο κρίσιμη διαφορά μεταξύ μιας λίστας και μιας πλειάδας στην Python είναι ότι μια πλειάδα είναι αμετάβλητη. Αυτό σημαίνει ότι δεν μπορείτε να τροποποιήσετε μια πλειάδα στη θέση της.

▶️ Εδώ είναι ένα παράδειγμα.

tuple1 = ("Java","Python","C++")
tuple1[0] = "Rust"

# Output
----> 2 tuple1[0] = "Rust"

TypeError: 'tuple' object does not support item assignment

Μια λίστα είναι μια μεταβλητή δομή δεδομένων, επομένως μπορούμε να τροποποιήσουμε τη λίστα αλλάζοντας ένα στοιχείο σε ένα συγκεκριμένο ευρετήριο, όπως στο παρακάτω κελί κώδικα.

list1 = ["Java","Python","C++"]
list1[0] = "Rust"
print(list1)

# Output
['Rust', 'Python', 'C++']

#2. Λίστες μεταβλητού μήκους έναντι πλειάδων σταθερού μήκους

Η λίστα Python είναι μια δομή δεδομένων μεταβλητού μήκους.

Μπορείτε να κάνετε τα εξής:

  • Προσθέστε ένα στοιχείο στο τέλος της λίστας
  • Προσθέστε στοιχεία από άλλη λίστα στο τέλος της τρέχουσας λίστας
  • Καταργήστε στοιχεία σε ένα συγκεκριμένο ευρετήριο από τη λίστα
list1 = [2,3,4,5]

# add an item to the end
list1.append(9)
print(list1)

# add items from list2 to the end of list1
list2 = [0,7]
list1.extend(list2)
print(list1)

# remove an item from list1
list1.pop(0)
print(list1)

▶️ Η έξοδος του παραπάνω αποσπάσματος κώδικα.

# Output
[2, 3, 4, 5, 9]
[2, 3, 4, 5, 9, 0, 7]
[3, 4, 5, 9, 0, 7]

Οι πλειάδες είναι δομές δεδομένων σταθερού μήκους. Επομένως, δεν μπορείτε να προσθέσετε ή να αφαιρέσετε στοιχεία από μια υπάρχουσα πλειάδα. Αλλά μπορείτε να επαναπροσδιορίσετε την πλειάδα ώστε να περιέχει διαφορετικά στοιχεία.

tuple1 = (2,4,6,8)
tuple1 = (1,8,9)
print(tuple1)

# Output
(1, 8, 9)

#3. Μέγεθος στη μνήμη

Τώρα θα βασιστούμε σε αυτά που μάθαμε στην προηγούμενη ενότητα: η λίστα είναι μια δομή δεδομένων μεταβλητού μήκους.

  Πώς να διαγράψετε τον λογαριασμό VK

Όταν ορίζετε τη λίστα αρχικά, εκχωρείται ένα συγκεκριμένο μέγεθος για αυτήν στη μνήμη. Τώρα, όταν τροποποιείτε μια λίστα χρησιμοποιώντας τις μεθόδους append() ή extend(), θα πρέπει να εκχωρηθεί πρόσθετη μνήμη για την αποθήκευση των προστιθέμενων στοιχείων. Αυτή η κατανομή γίνεται σχεδόν πάντα περισσότερο από τον αριθμό των στοιχείων που προσθέτετε.

Επομένως, υπάρχει ανάγκη να παρακολουθείτε τον αριθμό των στοιχείων στη λίστα και τον εκχωρημένο χώρο. Επιπλέον, καθώς οι λίστες έχουν μεταβλητό μήκος, υπάρχει ένας δείκτης που δείχνει τη διεύθυνση των στοιχείων της λίστας. Ως αποτέλεσμα, οι λίστες με μήκος k καταλαμβάνουν περισσότερη μνήμη από μια πλειάδα με τα ίδια k στοιχεία.

Εδώ είναι μια απλή απεικόνιση.

Μπορείτε να χρησιμοποιήσετε τη μέθοδο getsizeof() της ενσωματωμένης μονάδας sys σε ένα αντικείμενο Python για να λάβετε το μέγεθος ενός αντικειμένου στη μνήμη.

import sys

list1 = [4,5,9,14]
list_size = sys.getsizeof(list1)
print(f"Size of list:{list_size}")

tuple1 = (4,5,9,14)
tuple_size = sys.getsizeof(tuple1)
print(f"Size of tuple:{tuple_size}")

Μια λίστα καταλαμβάνει περισσότερη μνήμη από μια πλειάδα για τον ίδιο αριθμό και τιμή στοιχείων, όπως επαληθεύεται στην παρακάτω έξοδο.

# Output
Size of list:104
Size of tuple:88

Πότε πρέπει να χρησιμοποιήσετε μια πλειάδα Python;

Από τις διαφορές και τις ομοιότητες μεταξύ των λιστών Python και των πλειάδων, ξέρετε ότι εάν χρειάζεστε μια μεταβλητή συλλογή, θα πρέπει να χρησιμοποιήσετε μια λίστα.

Πότε όμως πρέπει να χρησιμοποιήσετε μια πλειάδα;

Θα το εξετάσουμε σε αυτήν την ενότητα.

#1. Συλλογή μόνο για ανάγνωση

Κάθε φορά που θέλετε μια συλλογή να είναι αμετάβλητη, θα πρέπει να την ορίζετε ως πλειάδα. Ας υποθέσουμε ότι χρώμα = (243,55,103) μια πλειάδα που περιέχει τις τιμές RGB που αντιστοιχούν σε μια χρωματική απόχρωση. Ο καθορισμός του χρώματος ως πλειάδα διασφαλίζει ότι δεν μπορεί να τροποποιηθεί.

Στην ουσία, όταν χρειάζεστε μια συλλογή να είναι μόνο για ανάγνωση: οι τιμές δεν πρέπει να τροποποιούνται κατά τη διάρκεια του προγράμματος, θα πρέπει να σκεφτείτε να χρησιμοποιήσετε μια πλειάδα. Αυτό θα αποτρέψει την ακούσια τροποποίηση των τιμών.

#2. Κλειδιά Λεξικού

Για παράδειγμα, δημιουργείτε ένα λεξικό χρησιμοποιώντας ως κλειδιά τα στοιχεία λίστας key_list. Μπορείτε να χρησιμοποιήσετε τη μέθοδο dict.fromkeys() για να δημιουργήσετε ένα λεξικό από μια λίστα.

key_list = list("ABCD")
dict.fromkeys(key_list)

{'A': None, 'B': None, 'C': None, 'D': None}

Ας υποθέσουμε ότι τροποποιήσατε τη λίστα ώστε να περιέχει το «D» ως πρώτο στοιχείο (ευρετήριο 0)—πριν δημιουργήσετε το λεξικό.

Τώρα, τι συμβαίνει με το κλειδί λεξικού ‘A’;

Εάν προσπαθήσετε να δημιουργήσετε ένα λεξικό από το key_list και αποκτήσετε πρόσβαση στην τιμή που αντιστοιχεί στο κλειδί ‘A’, θα αντιμετωπίσετε ένα KeyError.

key_list[0] = 'D'

dict.fromkeys(key_list)['A']

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-31-c90392acc2cf> in <module>()
----> 1 dict.fromkeys(key_list)['A']

KeyError: 'A'

Τα κλειδιά ενός λεξικού πρέπει να είναι μοναδικά. Επομένως, δεν μπορείτε να έχετε ένα δεύτερο «D» ως κλειδί.

dict.fromkeys(key_list)
{'B': None, 'C': None, 'D': None} # A is no longer a key.

Αν αντ’ αυτού χρησιμοποιείτε πλειάδα, αυτή η τροποποίηση είναι αδύνατη και είναι λιγότερο πιθανό να αντιμετωπίσετε σφάλματα. Επομένως, θα πρέπει να προτιμάτε να δημιουργείτε ένα λεξικό χρησιμοποιώντας τα στοιχεία μιας πλειάδας ως κλειδιά.

key_tuple = tuple("ABCD")
dict.fromkeys(key_tuple)
{'A': None, 'B': None, 'C': None, 'D': None}

key_tuple[0] = 'D'
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-12-2cecbefa7db2> in <module>()
----> 1 key_tuple[0] = 'D'

TypeError: 'tuple' object does not support item assignment

#3. Επιχειρήματα συνάρτησης

Το αμετάβλητο των πλειάδων τις καθιστά επίσης κατάλληλες για μεταβίβαση ως ορίσματα συνάρτησης.

  Πώς να αποκτήσετε δωρεάν Internet (στο σπίτι και στο κοινό)

Θεωρήστε την ακόλουθη συνάρτηση find_volume() που επιστρέφει τον όγκο ενός κυβοειδούς με τις διαστάσεις: μήκος, πλάτος και ύψος.

def find_volume(dimensions):
  l,b,h = dimensions
  return l*b*h

Ας υποθέσουμε ότι αυτές οι διαστάσεις είναι διαθέσιμες σε μια λίστα που ονομάζεται διαστάσεις. Η κλήση για find_volume() με διαστάσεις ως όρισμα επιστρέφει τον τόμο.

dimensions = [2,8,5]
find_volume(dimensions)
80

Μπορείτε πάντα να αλλάξετε τις διαστάσεις που είναι αποθηκευμένες σε μια λίστα.

dimensions = [20,8,5]
find_volume(dimensions)
800

Ωστόσο, μερικές φορές θα χρειαστείτε οι τιμές να παραμείνουν σταθερές και να αντισταθείτε στην τροποποίηση. Τότε θα πρέπει να σκεφτείτε να αποθηκεύσετε τα ορίσματα ως πλειάδα και να τα χρησιμοποιήσετε στην κλήση συνάρτησης.

#4. Επιστροφή τιμών από συναρτήσεις

Στην Python, θα συναντήσετε πλειάδες σε τιμές επιστροφής από συναρτήσεις. Όταν επιστρέφετε πολλές τιμές από μια συνάρτηση, η Python τις επιστρέφει σιωπηρά ως πλειάδα.

Εξετάστε την ακόλουθη συνάρτηση return_even():

def return_even(num):
  even = [i for i in range(num) if (i%2==0)]
  return even,len(even)
  • Παίρνει έναν αριθμό num ως όρισμα
  • Επιστρέφει τη λίστα των ζυγών αριθμών στο διάστημα [0,num) and the length of that list.

Let’s set the value of num 20 and call the function.

num = 20

Calling return_even() returns the two values in a tuple. You can call the type() function with the function call as the verification argument.

type(return_even(num)) # <class 'tuple'>

You can print out the return value to verify that it’s a tuple containing the list of even numbers as the first item and the length of the list as the second item.

print(return_even(num))
([0, 2, 4, 6, 8, 10, 12, 14, 16, 18]10)

Καθώς υπάρχουν δύο στοιχεία στην πλειάδα, μπορείτε να τα αποσυσκευάσετε σε δύο μεταβλητές, όπως φαίνεται παρακάτω.

even_nums, count = return_even(num)

print(even_nums)
print(count)

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
10

συμπέρασμα

Ελπίζω ότι αυτό το σεμινάριο παρείχε μια ολοκληρωμένη σύγκριση της πλειάδας Python εναντίον της λίστας.

Ας ολοκληρώσουμε το σεμινάριο με μια γρήγορη περίληψη:

  • Η λίστα και οι πλειάδες είναι ενσωματωμένες δομές δεδομένων στην Python.
  • Ομοιότητες: επαναλαμβανόμενα στοιχεία, υποστήριξη για ευρετηρίαση, τεμαχισμό, διαφορετικοί τύποι δεδομένων και τελεστής για δοκιμή ιδιότητας μέλους.
  • Βασική διαφορά: Οι λίστες είναι μεταβλητές και οι πλειάδες είναι αμετάβλητες.
  • Άλλες διαφορές: Σταθερό μήκος πλειάδων και μεταβλητό μήκος λιστών, μικρότερο μέγεθος στη μνήμη των πλειάδων.
  • Πότε πρέπει να χρησιμοποιήσετε πλειάδα; Για αμετάβλητες συλλογές, πλήκτρα λεξικού και ορίσματα συναρτήσεων.

Στη συνέχεια, ελέγξτε τα έργα Python για εξάσκηση και μάθηση. Ή μάθετε μεθόδους αφαίρεσης διπλότυπων στοιχείων από λίστες Python. Καλή μάθηση! τότε, καλή κωδικοποίηση!👩🏽‍💻