Ένα σύνολο είναι μια μεταβλητή και μη διατεταγμένη συλλογή από κατακερματίσιμα αντικείμενα.
Τα μέλη ενός συνόλου πρέπει να είναι διακριτά, δηλαδή δεν επιτρέπονται διπλότυπα στοιχεία.
Μπορούν να περιέχουν πολλαπλούς διαφορετικούς τύπους δεδομένων ακόμα και εμφωλευμένες δομές, όπως μια tuple από tuples, αρκεί όλα τα στοιχεία να μπορούν να κατακερματιστούν.
Τα σύνολα διατίθενται και σε αμετάβλητη εκδοχή, τα frozensets.
Τα σύνολα χρησιμοποιούνται πιο συχνά για να αφαιρείς γρήγορα τα διπλότυπα από άλλες δομές δεδομένων ή ομαδοποιήσεις στοιχείων. Χρησιμοποιούνται επίσης για αποδοτικές συγκρίσεις, όταν δεν χρειάζεται η σειρά ούτε η παρακολούθηση διπλοτύπων.
Όπως και οι άλλοι τύποι συλλογών (λεξικά, λίστες, πλειάδες), τα sets υποστηρίζουν:
for item in <set>
in και not in,len(), καιcopy()
Τα sets δεν υποστηρίζουν:
+
Ο έλεγχος συμμετοχής σε ένα set έχει σταθερή χρονική πολυπλοκότητα (κατά μέσο όρο) έναντι του ελέγχου συμμετοχής σε μια list ή ένα string, όπου η χρονική πολυπλοκότητα αυξάνεται όσο μεγαλώνει το μήκος των δεδομένων.
Μέθοδοι όπως οι <set>.union(), <set>.intersection() ή <set>.difference() έχουν επίσης σταθερή χρονική πολυπλοκότητα (κατά μέσο όρο).
Ένα set μπορεί να γραφτεί απευθείας ως κυριολεκτικό συνόλου με άγκιστρα {} και κόμμα ανάμεσα στα στοιχεία.
Τα διπλότυπα παραλείπονται σιωπηρά:
>>> one_element = {'➕'}
{'➕'}
>>> multiple_elements = {'➕', '🔻', '🔹', '🔆'}
{'➕', '🔻', '🔹', '🔆'}
>>> multiple_duplicates = {'Hello!', 'Hello!', 'Hello!',
'¡Hola!','Привіт!', 'こんにちは!',
'¡Hola!','Привіт!', 'こんにちは!'}
{'こんにちは!', '¡Hola!', 'Hello!', 'Привіт!'}
Τα κυριολεκτικά συνόλου χρησιμοποιούν τα ίδια άγκιστρα με τα κυριολεκτικά dict, που σημαίνει ότι χρειάζεται να χρησιμοποιήσεις τη set() για να δημιουργήσεις ένα κενό set.
Η set() (ο κατασκευαστής της κλάσης set) μπορεί να χρησιμοποιηθεί με οποιοδήποτε iterable που περνάς ως όρισμα.
Τα στοιχεία του iterable διατρέχονται ένα ένα και προστίθενται μεμονωμένα στο set.
Η σειρά των στοιχείων δεν διατηρείται και τα διπλότυπα παραλείπονται σιωπηρά:
# To create an empty set, the constructor must be used.
>>> no_elements = set()
set()
# The tuple is unpacked & each element is added.
# Duplicates are removed.
>>> elements_from_tuple = set(("Parrot", "Bird",
334782, "Bird", "Parrot"))
{334782, 'Bird', 'Parrot'}
# The list is unpacked & each element is added.
# Duplicates are removed.
>>> elements_from_list = set([2, 3, 2, 3, 3, 3, 5,
7, 11, 7, 11, 13, 13])
{2, 3, 5, 7, 11, 13}
Εξαιτίας της συμπεριφοράς "αποσυσκευασίας" που έχει, η χρήση της set() με μια συμβολοσειρά μπορεί να σε εκπλήξει:
# String elements (Unicode code points) are
# iterated through and added *individually*.
>>> elements_string = set("Timbuktu")
{'T', 'b', 'i', 'k', 'm', 't', 'u'}
# Unicode separators and positioning code points
# are also added *individually*.
>>> multiple_code_points_string = set('अभ्यास')
{'अ', 'भ', 'य', 'स', 'ा', '्'}
Τα σύνολα μπορούν να περιέχουν διαφορετικούς τύπους δεδομένων και εμφωλευμένους τύπους δεδομένων, αλλά όλα τα στοιχεία ενός set πρέπει να είναι κατακερματίσιμα:
# Attempting to use a list for a set member throws a TypeError
>>> lists_as_elements = {['🌈','💦'],
['☁️','⭐️','🌍'],
['⛵️', '🚲', '🚀']}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
# Standard sets are mutable, so they cannot be hashed.
>>> sets_as_elements = {{'🌈','💦'},
{'☁️','⭐️','🌍'},
{'⛵️', '🚲', '🚀'}}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'
Τα σύνολα έχουν μεθόδους που γενικά μιμούνται τις μαθηματικές πράξεις συνόλων.
Οι περισσότερες (όχι όλες) από αυτές τις μεθόδους έχουν ισοδύναμο τελεστή.
Οι μέθοδοι γενικά δέχονται οποιοδήποτε iterable ως όρισμα, ενώ οι τελεστές απαιτούν και οι δύο πλευρές της πράξης να είναι sets ή frozensets.
Η μέθοδος <set>.isdisjoint(<other_collection>) χρησιμοποιείται για να ελέγξεις αν τα στοιχεία ενός set έχουν κάποια επικάλυψη με τα στοιχεία ενός άλλου set.
Η μέθοδος δέχεται οποιοδήποτε iterable ή set ως όρισμα.
Επιστρέφει True αν τα δύο σύνολα δεν έχουν κοινά στοιχεία, False αν μοιράζονται στοιχεία.
Δεν υπάρχει ισοδύναμος τελεστής:
# Both mammals and additional_animals are lists.
>>> mammals = ['squirrel','dog','cat','cow', 'tiger', 'elephant']
>>> additional_animals = ['pangolin', 'panda', 'parrot',
'lemur', 'tiger', 'pangolin']
# Animals is a dict.
>>> animals = {'chicken': 'white',
'sparrow': 'grey',
'eagle': 'brown and white',
'albatross': 'grey and white',
'crow': 'black',
'elephant': 'grey',
'dog': 'rust',
'cow': 'black and white',
'tiger': 'orange and black',
'cat': 'grey',
'squirrel': 'black'}
# Birds is a set.
>>> birds = {'crow','sparrow','eagle','chicken', 'albatross'}
# Mammals and birds don't share any elements.
>>> birds.isdisjoint(mammals)
True
# There are also no shared elements between
# additional_animals and birds.
>>> birds.isdisjoint(additional_animals)
True
# Animals and mammals have shared elements.
# **Note** The first object needs to be a set or converted to a set
# since .isdisjoint() is a set method.
>>> set(animals).isdisjoint(mammals)
False
Η <set>.issubset(<other_collection>) χρησιμοποιείται για να ελέγξεις αν κάθε στοιχείο του <set> βρίσκεται και στο <other_collection>.
Η μορφή με τελεστή είναι <set> <= <other_set>:
# Both mammals and additional_animals are lists.
>>> mammals = ['squirrel','dog','cat','cow', 'tiger', 'elephant']
>>> additional_animals = ['pangolin', 'panda', 'parrot',
'lemur', 'tiger', 'pangolin']
# Animals is a dict.
>>> animals = {'chicken': 'white',
'sparrow': 'grey',
'eagle': 'brown and white',
'albatross': 'grey and white',
'crow': 'black',
'elephant': 'grey',
'dog': 'rust',
'cow': 'black and white',
'tiger': 'orange and black',
'cat': 'grey',
'squirrel': 'black'}
# Birds is a set.
>>> birds = {'crow','sparrow','eagle','chicken', 'albatross'}
# Set methods will take any iterable as an argument.
# All members of birds are also members of animals.
>>> birds.issubset(animals)
True
# All members of mammals also appear in animals.
# **Note** The first object needs to be a set or converted to a set
# since .issubset() is a set method.
>>> set(mammals).issubset(animals)
True
# Both objects need to be sets to use a set operator
>>> birds <= set(mammals)
False
# A set is always a loose subset of itself.
>>> set(additional_animals) <= set(additional_animals)
True
Η <set>.issuperset(<other_collection>) είναι το αντίστροφο της .issubset().
Χρησιμοποιείται για να ελέγξεις αν κάθε στοιχείο του <other_collection> βρίσκεται και στο <set>.
Η μορφή με τελεστή είναι <set> >= <other_set>:
# All members of mammals also appear in animals.
# **Note** The first object needs to be a set or converted to a set
# since .issuperset() is a set method.
>>> set(animals).issuperset(mammals)
True
# All members of animals do not show up as members of birds.
>>> birds.issuperset(animals)
False
# Both objects need to be sets to use a set operator
>>> birds >= set(mammals)
False
# A set is always a loose superset of itself.
>>> set(animals) >= set(animals)
True
Η <set>.intersection(*<other iterables>) επιστρέφει ένα νέο set με τα στοιχεία που είναι κοινά στο αρχικό set και σε όλα τα <others> (με άλλα λόγια, το set όπου όλα τέμνονται).
Η μορφή αυτής της μεθόδου με τελεστή είναι <set> & <other set> & <other set 2> & ... <other set n>:
>>> perennials = {'Annatto','Asafetida','Asparagus','Azalea',
'Winter Savory', 'Broccoli','Curry Leaf','Fennel',
'Kaffir Lime','Kale','Lavender','Mint','Oranges',
'Oregano', 'Tarragon', 'Wild Bergamot'}
>>> annuals = {'Corn', 'Zucchini', 'Sweet Peas', 'Marjoram',
'Summer Squash', 'Okra','Shallots', 'Basil',
'Cilantro', 'Cumin', 'Sunflower', 'Chervil',
'Summer Savory'}
>>> herbs = ['Annatto','Asafetida','Basil','Chervil','Cilantro',
'Curry Leaf','Fennel','Kaffir Lime','Lavender',
'Marjoram','Mint','Oregano','Summer Savory',
'Tarragon','Wild Bergamot','Wild Celery',
'Winter Savory']
# Methods will take any iterable as an argument.
>>> perennial_herbs = perennials.intersection(herbs)
{'Annatto', 'Asafetida', 'Curry Leaf', 'Fennel', 'Kaffir Lime',
'Lavender', 'Mint', 'Oregano', 'Wild Bergamot','Winter Savory'}
# Operators require both groups be sets.
>>> annuals & set(herbs)
{'Basil', 'Chervil', 'Marjoram', 'Cilantro'}
Η <set>.union(*<other iterables>) επιστρέφει ένα νέο set με στοιχεία από το <set> και από όλα τα <other iterables>.
Η μορφή αυτής της μεθόδου με τελεστή είναι <set> | <other set 1> | <other set 2> | ... | <other set n>:
>>> perennials = {'Asparagus', 'Broccoli', 'Sweet Potato', 'Kale'}
>>> annuals = {'Corn', 'Zucchini', 'Sweet Peas', 'Summer Squash'}
>>> more_perennials = ['Radicchio', 'Rhubarb',
'Spinach', 'Watercress']
# Methods will take any iterable as an argument.
>>> perennials.union(more_perennials)
{'Asparagus','Broccoli','Kale','Radicchio','Rhubarb',
'Spinach','Sweet Potato','Watercress'}
# Operators require sets.
>>> set(more_perennials) | perennials
{'Asparagus',
'Broccoli',
'Kale',
'Radicchio',
'Rhubarb',
'Spinach',
'Sweet Potato',
'Watercress'}
Η <set>.difference(*<other iterables>) επιστρέφει ένα νέο set με στοιχεία του αρχικού <set> που δεν βρίσκονται στα <others>.
Η μορφή αυτής της μεθόδου με τελεστή είναι <set> - <other set 1> - <other set 2> - ...<other set n>.
>>> berries_and_veggies = {'Asparagus',
'Broccoli',
'Watercress',
'Goji Berries',
'Goose Berries',
'Ramps',
'Walking Onions',
'Blackberries',
'Strawberries',
'Rhubarb',
'Kale',
'Artichokes',
'Currants'}
>>> veggies = ('Asparagus', 'Broccoli', 'Watercress', 'Ramps',
'Walking Onions', 'Rhubarb', 'Kale', 'Artichokes')
# Methods will take any iterable as an argument.
>>> berries = berries_and_veggies.difference(veggies)
{'Blackberries','Currants','Goji Berries',
'Goose Berries', 'Strawberries'}
# Operators require sets.
>>> berries_and_veggies - berries
{'Artichokes','Asparagus','Broccoli','Kale',
'Ramps','Rhubarb','Walking Onions','Watercress'}
Η <set>.symmetric_difference(<other iterable>) επιστρέφει ένα νέο set που περιέχει τα στοιχεία που βρίσκονται στο <set> Ή στο <other>, αλλά όχι και στα δύο.
Η μορφή αυτής της μεθόδου με τελεστή είναι <set> ^ <other set>:
>>> plants_1 = {'🌲','🍈','🌵', '🥑','🌴', '🥭'}
>>> plants_2 = ('🌸','🌴', '🌺', '🌲', '🌻', '🌵')
# Methods will take any iterable as an argument.
>>> fruit_and_flowers = plants_1.symmetric_difference(plants_2)
>>> fruit_and_flowers
{'🌸', '🌺', '🍈', '🥑', '🥭','🌻' }
# Operators require both groups be sets.
>>> fruit_and_flowers ^ plants_1
{'🌲', '🌸', '🌴', '🌵','🌺', '🌻'}
>>> fruit_and_flowers ^ set(plants_2)
{'🥭', '🌴', '🌵', '🍈', '🌲', '🥑'}
Η συμμετρική διαφορά περισσότερων από δύο συνόλων θα δώσει ένα set που περιλαμβάνει και τα στοιχεία που είναι μοναδικά σε κάθε set ΚΑΙ τα στοιχεία που μοιράζονται περισσότερα από δύο σύνολα της σειράς (λεπτομέρειες στο άρθρο της Wikipedia για τη συμμετρική διαφορά).
Για να πάρεις μόνο τα στοιχεία που είναι μοναδικά σε κάθε set της σειράς, πρέπει να συγκεντρώσεις σε ένα ξεχωριστό βήμα τις τομές όλων των συνδυασμών ανά δύο συνόλων και μετά να τις αφαιρέσεις:
>>> one = {'black pepper','breadcrumbs','celeriac','chickpea flour',
'flour','lemon','parsley','salt','soy sauce',
'sunflower oil','water'}
>>> two = {'black pepper','cornstarch','garlic','ginger',
'lemon juice','lemon zest','salt','soy sauce','sugar',
'tofu','vegetable oil','vegetable stock','water'}
>>> three = {'black pepper','garlic','lemon juice','mixed herbs',
'nutritional yeast', 'olive oil','salt','silken tofu',
'smoked tofu','soy sauce','spaghetti','turmeric'}
>>> four = {'barley malt','bell pepper','cashews','flour',
'fresh basil','garlic','garlic powder', 'honey',
'mushrooms','nutritional yeast','olive oil','oregano',
'red onion', 'red pepper flakes','rosemary','salt',
'sugar','tomatoes','water','yeast'}
>>> intersections = (one & two | one & three | one & four |
two & three | two & four | three & four)
...
{'black pepper','flour','garlic','lemon juice','nutritional yeast',
'olive oil','salt','soy sauce', 'sugar','water'}
# The ^ operation will include some of the items in intersections,
# which means it is not a "clean" symmetric difference - there
# are overlapping members.
>>> (one ^ two ^ three ^ four) & intersections
{'black pepper', 'garlic', 'soy sauce', 'water'}
# Overlapping members need to be removed in a separate step
# when there are more than two sets that need symmetric difference.
>>> (one ^ two ^ three ^ four) - intersections
...
{'barley malt','bell pepper','breadcrumbs', 'cashews','celeriac',
'chickpea flour','cornstarch','fresh basil', 'garlic powder',
'ginger','honey','lemon','lemon zest','mixed herbs','mushrooms',
'oregano','parsley','red onion','red pepper flakes','rosemary',
'silken tofu','smoked tofu','spaghetti','sunflower oil', 'tofu',
'tomatoes','turmeric','vegetable oil','vegetable stock','yeast'}
Εσύ και οι επιχειρηματικοί σου συνεργάτες έχετε μια μικρή εταιρεία catering. Μόλις συμφωνήσατε να διοργανώσετε μια εκδήλωση για έναν τοπικό σύλλογο μαγειρικής, με τα "αγαπημένα του συλλόγου" πιάτα. Ο σύλλογος δεν έχει εμπειρία στη διοργάνωση μεγάλων εκδηλώσεων και χρειάζεται βοήθεια στην οργάνωση, στα ψώνια, στην προετοιμασία και στο σερβίρισμα. Αποφάσισες να γράψεις μερικά μικρά σκριπτ Python, για να επιταχύνεις όλη τη διαδικασία του σχεδιασμού.
Οι συνταγές της εκδήλωσης προστέθηκαν από διάφορες πηγές και τα συστατικά τους φαίνεται να έχουν διπλές (ή και περισσότερες) καταχωρίσεις. Δεν θέλεις να καταλήξεις να αγοράσεις περισσότερα υλικά από όσα χρειάζεσαι! Πριν ξεκινήσουν τα ψώνια και το μαγείρεμα, η λίστα συστατικών κάθε πιάτου πρέπει να "καθαριστεί".
Υλοποίησε τη συνάρτηση clean_ingredients(<dish_name>, <dish_ingredients>), που παίρνει το όνομα ενός πιάτου και μια list με συστατικά.
Η συνάρτηση πρέπει να επιστρέφει ένα tuple με το όνομα του πιάτου ως πρώτο στοιχείο, ακολουθούμενο από το set των συστατικών χωρίς διπλότυπα.
>>> clean_ingredients('Punjabi-Style Chole', ['onions', 'tomatoes', 'ginger paste', 'garlic paste', 'ginger paste', 'vegetable oil', 'bay leaves', 'cloves', 'cardamom', 'cilantro', 'peppercorns', 'cumin powder', 'chickpeas', 'coriander powder', 'red chili powder', 'ground turmeric', 'garam masala', 'chickpeas', 'ginger', 'cilantro'])
>>> ('Punjabi-Style Chole', {'garam masala', 'bay leaves', 'ground turmeric', 'ginger', 'garlic paste', 'peppercorns', 'ginger paste', 'red chili powder', 'cardamom', 'chickpeas', 'cumin powder', 'vegetable oil', 'tomatoes', 'coriander powder', 'onions', 'cilantro', 'cloves'})
Η εκδήλωση θα περιλαμβάνει και κοκτέιλ και "mocktails", δηλαδή μικτά ποτά χωρίς το αλκοόλ. Πρέπει να βεβαιωθείς ότι τα ποτά "mocktail" είναι πραγματικά χωρίς αλκοόλ και ότι τα κοκτέιλ όντως περιέχουν αλκοόλ.
Υλοποίησε τη συνάρτηση check_drinks(<drink_name>, <drink_ingredients>), που παίρνει το όνομα ενός ποτού και μια list με συστατικά.
Η συνάρτηση πρέπει να επιστρέφει το όνομα του ποτού ακολουθούμενο από "Mocktail" αν το ποτό δεν έχει αλκοολούχα συστατικά, και το όνομα του ποτού ακολουθούμενο από "Cocktail" αν το ποτό περιέχει αλκοόλ.
Για τους σκοπούς αυτής της άσκησης, τα κοκτέιλ θα περιέχουν αλκοόλ μόνο από τη σταθερά ALCOHOLS στο sets_categories_data.py:
>>> from sets_categories_data import ALCOHOLS
>>> check_drinks('Honeydew Cucumber', ['honeydew', 'coconut water', 'mint leaves', 'lime juice', 'salt', 'english cucumber'])
...
'Honeydew Cucumber Mocktail'
>>> check_drinks('Shirley Tonic', ['cinnamon stick', 'scotch', 'whole cloves', 'ginger', 'pomegranate juice', 'sugar', 'club soda'])
...
'Shirley Tonic Cocktail'
Η λίστα καλεσμένων περιλαμβάνει συνδαιτυμόνες με διαφορετικές διατροφικές ανάγκες, και το προσωπικό σου θα πρέπει να χωρίσει τα πιάτα σε Vegan, Vegetarian, Paleo, Keto και Omnivore. Ένα πιάτο ανήκει σε μια κατηγορία μόνο αν όλα τα συστατικά του υπάρχουν στο σύνολο συστατικών της κατηγορίας.
Υλοποίησε τη συνάρτηση categorize_dish(<dish_name>, <dish_ingredients>), που παίρνει το όνομα ενός πιάτου και ένα set με τα συστατικά του πιάτου.
Η συνάρτηση πρέπει να επιστρέφει μια συμβολοσειρά με τη μορφή dish name: <CATEGORY> (σε ποια κατηγορία γεύματος ανήκει το πιάτο).
Όλα τα πιάτα που δίνονται θα "ταιριάζουν" σε μία από τις κατηγορίες που εισάγονται από το sets_categories_data.py (VEGAN, VEGETARIAN, PALEO, KETO ή OMNIVORE).
>>> from sets_categories_data import VEGAN, VEGETARIAN, PALEO, KETO, OMNIVORE
>>> categorize_dish('Sticky Lemon Tofu', {'tofu', 'soy sauce', 'salt', 'black pepper', 'cornstarch', 'vegetable oil', 'garlic', 'ginger', 'water', 'vegetable stock', 'lemon juice', 'lemon zest', 'sugar'})
...
'Sticky Lemon Tofu: VEGAN'
>>> categorize_dish('Shrimp Bacon and Crispy Chickpea Tacos with Salsa de Guacamole', {'shrimp', 'bacon', 'avocado', 'chickpeas', 'fresh tortillas', 'sea salt', 'guajillo chile', 'slivered almonds', 'olive oil', 'butter', 'black pepper', 'garlic', 'onion'})
...
'Shrimp Bacon and Crispy Chickpea Tacos with Salsa de Guacamole: OMNIVORE'
Κάποιοι καλεσμένοι έχουν αλλεργίες και επιπλέον διατροφικούς περιορισμούς. Αυτά τα συστατικά πρέπει να επισημαίνονται/να σχολιάζονται για κάθε πιάτο, ώστε να μη δημιουργούν προβλήματα.
Υλοποίησε τη συνάρτηση tag_special_ingredients(<dish>), που παίρνει ένα tuple με το όνομα του πιάτου στην πρώτη θέση και μια list ή ένα set με τα συστατικά του πιάτου στη δεύτερη θέση.
Επίστρεψε το όνομα του πιάτου ακολουθούμενο από το set των συστατικών που χρειάζονται ειδική σημείωση στην περιγραφή του πιάτου.
Τα συστατικά ενός πιάτου μέσα σε μια list μπορεί να έχουν ή να μην έχουν διπλότυπα.
Για τους σκοπούς αυτής της άσκησης, όλα τα αλλεργιογόνα ή τα ειδικά συστατικά που χρειάζονται επισήμανση βρίσκονται στη σταθερά SPECIAL_INGREDIENTS που εισάγεται από το sets_categories_data.py.
>>> from sets_categories_data import SPECIAL_INGREDIENTS
>>> tag_special_ingredients(('Ginger Glazed Tofu Cutlets', ['tofu', 'soy sauce', 'ginger', 'corn starch', 'garlic', 'brown sugar', 'sesame seeds', 'lemon juice']))
...
('Ginger Glazed Tofu Cutlets', {'garlic','soy sauce','tofu'})
>>> tag_special_ingredients(('Arugula and Roasted Pork Salad', ['pork tenderloin', 'arugula', 'pears', 'blue cheese', 'pine nuts', 'balsamic vinegar', 'onions', 'black pepper']))
...
('Arugula and Roasted Pork Salad', {'pork tenderloin', 'blue cheese', 'pine nuts', 'onions'})
Για να προετοιμαστείς για τις παραγγελίες και τα ψώνια, θα χρειαστεί να συντάξεις μια "κύρια λίστα" με συστατικά για όλα όσα υπάρχουν στο μενού (οι ποσότητες θα συμπληρωθούν αργότερα).
Υλοποίησε τη συνάρτηση compile_ingredients(<dishes>), που παίρνει μια list με πιάτα και επιστρέφει ένα set με όλα τα συστατικά όλων των πιάτων της λίστας.
Κάθε επιμέρους πιάτο αντιπροσωπεύεται από το set των συστατικών του.
dishes = [ {'tofu', 'soy sauce', 'ginger', 'corn starch', 'garlic', 'brown sugar', 'sesame seeds', 'lemon juice'},
{'pork tenderloin', 'arugula', 'pears', 'blue cheese', 'pine nuts',
'balsamic vinegar', 'onions', 'black pepper'},
{'honeydew', 'coconut water', 'mint leaves', 'lime juice', 'salt', 'english cucumber'}]
>>> compile_ingredients(dishes)
...
{'arugula', 'brown sugar', 'honeydew', 'coconut water', 'english cucumber', 'balsamic vinegar', 'mint leaves', 'pears', 'pork tenderloin', 'ginger', 'blue cheese', 'soy sauce', 'sesame seeds', 'black pepper', 'garlic', 'lime juice', 'corn starch', 'pine nuts', 'lemon juice', 'onions', 'salt', 'tofu'}
Οι οικοδεσπότες σου έδωσαν μια λίστα με πιάτα που θα ήθελαν να ετοιμαστούν ως ορεκτικά "μιας μπουκιάς", για να σερβιριστούν σε δίσκους. Πρέπει να τα ξεχωρίσεις από την κύρια λίστα των πιάτων που ετοιμάζονται ως μεγαλύτερες μερίδες.
Υλοποίησε τη συνάρτηση separate_appetizers(<dishes>, <appetizers>), που παίρνει μια list με ονόματα πιάτων και μια list με ονόματα ορεκτικών.
Η συνάρτηση πρέπει να επιστρέφει τη list με τα ονόματα των πιάτων αφού αφαιρεθούν τα ονόματα των ορεκτικών.
Είτε η list <dishes> είτε η <appetizers> μπορεί να περιέχει διπλότυπα και ίσως χρειάζεται αφαίρεση διπλοτύπων.
dishes = ['Avocado Deviled Eggs','Flank Steak with Chimichurri and Asparagus', 'Kingfish Lettuce Cups',
'Grilled Flank Steak with Caesar Salad','Vegetarian Khoresh Bademjan','Avocado Deviled Eggs',
'Barley Risotto','Kingfish Lettuce Cups']
appetizers = ['Kingfish Lettuce Cups','Avocado Deviled Eggs','Satay Steak Skewers',
'Dahi Puri with Black Chickpeas','Avocado Deviled Eggs','Asparagus Puffs',
'Asparagus Puffs']
>>> separate_appetizers(dishes, appetizers)
...
['Vegetarian Khoresh Bademjan', 'Barley Risotto', 'Flank Steak with Chimichurri and Asparagus',
'Grilled Flank Steak with Caesar Salad']
Σε κάθε κατηγορία (Vegan, Vegetarian, Paleo, Keto, Omnivore), θα ξεχωρίσεις τα συστατικά που εμφανίζονται σε ένα μόνο πιάτο. Αυτά τα συστατικά "singleton" θα ανατεθούν σε έναν ειδικό αγοραστή, για να μη ξεχαστούν στη βιασύνη να γίνουν όλα τα υπόλοιπα.
Υλοποίησε τη συνάρτηση singleton_ingredients(<dishes>, <INTERSECTIONS>), που παίρνει μια list με πιάτα και μια σταθερά <CATEGORY>_INTERSECTIONS για την ίδια κατηγορία.
Κάθε πιάτο αντιπροσωπεύεται από ένα set με τα συστατικά του.
Κάθε <CATEGORY>_INTERSECTIONS είναι ένα set με συστατικά που εμφανίζονται σε περισσότερα από ένα πιάτα της κατηγορίας.
Χρησιμοποιώντας πράξεις συνόλων, η συνάρτηση πρέπει να επιστρέφει ένα set με συστατικά "singleton" (συστατικά που εμφανίζονται σε ένα μόνο πιάτο της κατηγορίας).
from sets_categories_data import example_dishes, EXAMPLE_INTERSECTION
>>> singleton_ingredients(example_dishes, EXAMPLE_INTERSECTION)
...
{'garlic powder', 'sunflower oil', 'mixed herbs', 'cornstarch', 'celeriac', 'honey', 'mushrooms', 'bell pepper', 'rosemary', 'parsley', 'lemon', 'yeast', 'vegetable oil', 'vegetable stock', 'silken tofu', 'tofu', 'cashews', 'lemon zest', 'smoked tofu', 'spaghetti', 'ginger', 'breadcrumbs', 'tomatoes', 'barley malt', 'red pepper flakes', 'oregano', 'red onion', 'fresh basil'}
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Python με 17 έννοιες146 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.