A halmaz egy módosítható és nem sorrendezett gyűjtemény, amely hashable objektumokat tartalmaz.
A halmaz elemei csak különbözőek lehetnek, ismétlődő elemek nem szerepelhetnek benne.
Többféle adattípust és akár egymásba ágyazott szerkezeteket is tárolhatnak, például egy tuples-ből álló tuple-t, amennyiben minden elem hashed lehet.
A halmazoknak van egy megváltoztathatatlan változata is, a frozensets.
A halmazokat leggyakrabban arra használjuk, hogy gyorsan eltávolítsuk az ismétlődéseket más adatszerkezetekből vagy elemcsoportokból. Arra is jók, hogy hatékonyan hasonlítsunk össze dolgokat, amikor nincs szükség a sorrendezésre és az ismétlődések nyomon követésére.
A többi gyűjteménytípushoz (szótár, lista, tuple) hasonlóan a sets a következőket támogatja:
for item in <set> segítségévelin és not in operátorral,len() segítségével, valamintcopy() segítségévelA sets a következőket nem támogatja:
+ segítségévelA tagság vizsgálata egy set-ben átlagosan állandó időbonyolultságú, szemben a list-ben vagy string-ben való tagságvizsgálattal, ahol az időbonyolultság az adatok hosszával együtt nő.
Az olyan metódusok, mint a <set>.union(), <set>.intersection() vagy <set>.difference(), szintén átlagosan állandó időbonyolultságúak.
Egy set közvetlenül halmazliterálként adható meg kapcsos {} zárójelekkel és az elemek közötti vesszőkkel.
Az ismétlődő elemek csendben kimaradnak:
>>> one_element = {'➕'}
{'➕'}
>>> multiple_elements = {'➕', '🔻', '🔹', '🔆'}
{'➕', '🔻', '🔹', '🔆'}
>>> multiple_duplicates = {'Hello!', 'Hello!', 'Hello!',
'¡Hola!','Привіт!', 'こんにちは!',
'¡Hola!','Привіт!', 'こんにちは!'}
{'こんにちは!', '¡Hola!', 'Hello!', 'Привіт!'}
A halmazliterálok ugyanazokat a kapcsos zárójeleket használják, mint a dict literálok, ezért üres set létrehozásához a set() konstruktort kell használnod.
set konstruktorA set() (a set osztály konstruktora) bármilyen iterable argumentummal használható.
Az iterable elemein végigmegyünk, és egyenként adjuk hozzá őket a set-hez.
Az elemek sorrendje nem marad meg, és az ismétlődések csendben kimaradnak:
# 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}
A „kicsomagoló” viselkedése miatt a set() stringgel való használata meglepő lehet:
# 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('अभ्यास')
{'अ', 'भ', 'य', 'स', 'ा', '्'}
A halmazok különböző adattípusokat és egymásba ágyazott adattípusokat is tárolhatnak, de minden set elemnek hashable-nek kell lennie:
# 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'
A halmazok metódusai általában a matematikai halmazműveleteket utánozzák.
Ezeknek a metódusoknak a többségének (de nem mindegyikének) van operátor megfelelője.
A metódusok általában bármilyen iterable argumentumot elfogadnak, az operátorok viszont megkövetelik, hogy a művelet mindkét oldala set vagy frozenset legyen.
A <set>.isdisjoint(<other_collection>) metódussal vizsgálható, hogy egy set elemei átfedésben vannak-e egy másik set elemeivel.
A metódus bármilyen iterable vagy set argumentumot elfogad.
True-t ad vissza, ha a két halmaznak nincs közös eleme, és False-t, ha az elemek közösek.
Nincs operátor megfelelője:
# 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
A <set>.issubset(<other_collection>) metódussal ellenőrizhető, hogy a <set> minden eleme megtalálható-e az <other_collection>-ben is.
Az operátoros forma: <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
A <set>.issuperset(<other_collection>) a .issubset() inverze.
Azzal ellenőrizhető vele, hogy az <other_collection> minden eleme megtalálható-e a <set>-ben is.
Az operátoros forma: <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
A <set>.intersection(*<other iterables>) egy új set-et ad vissza, amely az eredeti set és az összes <others> közös elemeit tartalmazza (más szóval azt a set-et, ahol minden metszi egymást).
A metódus operátoros változata: <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'}
A <set>.union(*<other iterables>) egy új set-et ad vissza, amely a <set> és az összes <other iterables> elemeit tartalmazza.
A metódus operátoros formája: <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'}
A <set>.difference(*<other iterables>) egy új set-et ad vissza az eredeti <set> azon elemeivel, amelyek nincsenek benne az <others>-ben.
A metódus operátoros változata: <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'}
A <set>.symmetric_difference(<other iterable>) egy új set-et ad vissza, amely azokat az elemeket tartalmazza, amelyek a <set>-ben VAGY az <other>-ben benne vannak, de nem mindkettőben.
A metódus operátoros változata: <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)
{'🥭', '🌴', '🌵', '🍈', '🌲', '🥑'}
Több mint két halmaz szimmetrikus különbsége olyan set-et eredményez, amely egyszerre tartalmazza az egyes set-ek egyedi elemeit ÉS a sorozatban több mint két set között megosztott elemeket is (részletek a Wikipédia szimmetrikus különbségről szóló cikkében).
Ahhoz, hogy csak a sorozat egyes set-jeire egyedileg jellemző elemeket kapjuk meg, külön lépésben össze kell gyűjteni az összes kételemű kombináció metszetét, majd el kell távolítani azokat:
>>> 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'}
Te és az üzlettársaid egy kis cateringcéget vezettek. Épp most vállaltad el, hogy megszervezel egy eseményt egy helyi főzőklub számára, ahol „a klub kedvence” fogások szerepelnek. A klub nem tapasztalt nagy rendezvények lebonyolításában, és segítségre van szüksége a szervezéshez, a bevásárláshoz, az előkészítéshez és a tálaláshoz. Úgy döntöttél, hogy írsz néhány kis Python-szkriptet, hogy felgyorsítsd a teljes tervezési folyamatot.
A rendezvény receptjei többféle forrásból származnak, és úgy tűnik, a hozzávalóik között duplikált (vagy annál is több) bejegyzések vannak. Nem szeretnéd, ha végül felesleges alapanyagokat vásárolnál! Mielőtt elkezdődhet a bevásárlás és a főzés, minden fogás hozzávalólistáját „tisztítani” kell.
Valósítsd meg a clean_ingredients(<dish_name>, <dish_ingredients>) függvényt, amely paraméterül kapja egy fogás nevét és a hozzávalók egy list-jét.
Ez a függvény egy tuple-t adjon vissza, amelynek első eleme a fogás neve, ezt követi a hozzávalók duplikátumok nélküli set-je.
>>> 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'})
A rendezvényen koktélok és „mocktailok” is lesznek, azaz alkohol nélküli kevert italok. Gondoskodnod kell róla, hogy a „mocktail” italok valóban alkoholmentesek legyenek, a koktélok pedig tényleg tartalmazzanak alkoholt.
Valósítsd meg a check_drinks(<drink_name>, <drink_ingredients>) függvényt, amely paraméterül kapja egy ital nevét és a hozzávalók egy list-jét.
A függvény adja vissza az ital nevét, majd a „Mocktail” szót, ha az italban nincs alkoholos hozzávaló, és az ital nevét, majd a „Cocktail” szót, ha az ital tartalmaz alkoholt.
A feladat szempontjából a koktélok csak a sets_categories_data.py-ban található ALCOHOLS konstansban szereplő alkoholokat tartalmazzák:
>>> 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'
A vendéglistán különböző étrendi igényű vendégek szerepelnek, ezért a személyzetednek szét kell válogatnia a fogásokat a Vegan, Vegetarian, Paleo, Keto és Omnivore kategóriákba. Egy fogás csak akkor tartozik egy kategóriába, ha minden hozzávalója szerepel a kategória hozzávalóinak halmazában.
Valósítsd meg a categorize_dish(<dish_name>, <dish_ingredients>) függvényt, amely paraméterül kapja egy fogás nevét és a fogás hozzávalóinak egy set-jét.
A függvény egy stringet adjon vissza ebben a formában: dish name: <CATEGORY> (hogy melyik étkezési kategóriába tartozik a fogás).
A megadott fogások mindegyike „beleillik” az egyik, a sets_categories_data.py-ból importált kategóriába (VEGAN, VEGETARIAN, PALEO, KETO vagy 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'
Néhány vendégnek allergiája és további étkezési korlátozása van. Ezeket a hozzávalókat minden fogásnál meg kell jelölni, hogy ne okozzanak problémát.
Valósítsd meg a tag_special_ingredients(<dish>) függvényt, amely egy tuple-t kap: az első helyen a fogás neve, a második helyen pedig a fogás hozzávalóinak egy list-je vagy set-je áll.
Add vissza a fogás nevét, majd azon hozzávalók set-jét, amelyek külön megjegyzést igényelnek a fogás leírásában.
Előfordulhat, hogy egy list-ben a fogás hozzávalói között vannak duplikátumok, de az is lehet, hogy nincsenek.
A feladat szempontjából minden jelölendő allergén vagy különleges hozzávaló a sets_categories_data.py-ból importált SPECIAL_INGREDIENTS konstansban található.
>>> 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'})
A rendelés és a bevásárlás előkészítéséhez össze kell állítanod a menü összes fogásának hozzávalóiból egy „mesterlistát” (a mennyiségeket később töltjük ki).
Valósítsd meg a compile_ingredients(<dishes>) függvényt, amely paraméterül kapja a fogások egy list-jét, és visszaadja a felsorolt fogások összes hozzávalójából álló halmazt.
Minden egyes fogást a hozzávalóinak set-je képviseli.
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'}
A házigazdák megadták azon fogások listáját, amelyeket „falatnyi” előételként, tálcákon felszolgálva szeretnének előkészíttetni. Ezeket ki kell emelned a nagyobb adagként készülő fogások fő listájából.
Valósítsd meg a separate_appetizers(<dishes>, <appetizers>) függvényt, amely paraméterül kapja a fogásnevek egy list-jét és az előételek neveinek egy list-jét.
A függvény adja vissza a fogásnevek list-jét úgy, hogy az előételek nevei nincsenek benne.
A <dishes> és az <appetizers> list is tartalmazhat duplikátumokat, ezért szükség lehet a duplikátumok eltávolítására.
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']
Minden kategórián belül (Vegan, Vegetarian, Paleo, Keto, Omnivore) ki fogod emelni azokat a hozzávalókat, amelyek csak egy fogásban szerepelnek. Ezekhez a „singleton” hozzávalókhoz külön bevásárlót rendelünk, hogy a többi teendő hajszájában se feledkezzünk meg róluk.
Valósítsd meg a singleton_ingredients(<dishes>, <INTERSECTIONS>) függvényt, amely paraméterül kapja a fogások egy list-jét és az adott kategória <CATEGORY>_INTERSECTIONS konstansát.
Minden fogást a hozzávalóinak set-je képvisel.
Minden <CATEGORY>_INTERSECTIONS olyan hozzávalók set-je, amelyek a kategóriában egynél több fogásban szerepelnek.
Halmazműveletek használatával a függvényed adja vissza a „singleton” hozzávalók set-jét (olyan hozzávalókét, amelyek a kategóriában csak egy fogásban fordulnak elő).
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'}
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.