Ein Set ist eine veränderbare und ungeordnete Sammlung von hashbaren Objekten.
Die Elemente eines Sets müssen verschieden sein. Doppelte Einträge sind nicht erlaubt.
Ein Set kann verschiedene Datentypen und sogar verschachtelte Strukturen wie ein tuple aus tuples enthalten, solange sich alle Elemente hashen lassen.
Sets gibt es außerdem in einer unveränderbaren Variante: frozensets.
Sets werden am häufigsten verwendet, um Duplikate schnell aus anderen Datenstrukturen oder Elementgruppen zu entfernen. Sie eignen sich außerdem für effiziente Vergleiche, wenn es nicht auf die Reihenfolge oder das Verfolgen von Duplikaten ankommt.
Wie andere Sammlungstypen (Dictionaries, Listen, Tupel) unterstützen sets:
for item in <set>
in und not in,len(), undcopy()
sets unterstützen nicht:
+
Das Prüfen der Zugehörigkeit in einem set hat (im Durchschnitt) konstante Zeitkomplexität. Bei list und string wächst die Zeitkomplexität dagegen mit der Länge der Daten.
Methoden wie <set>.union(), <set>.intersection() oder <set>.difference() haben ebenfalls (im Durchschnitt) konstante Zeitkomplexität.
Ein set kannst du direkt als Set-Literal mit geschweiften Klammern {} und Kommas zwischen den Elementen angeben.
Duplikate werden stillschweigend weggelassen:
>>> one_element = {'➕'}
{'➕'}
>>> multiple_elements = {'➕', '🔻', '🔹', '🔆'}
{'➕', '🔻', '🔹', '🔆'}
>>> multiple_duplicates = {'Hello!', 'Hello!', 'Hello!',
'¡Hola!','Привіт!', 'こんにちは!',
'¡Hola!','Привіт!', 'こんにちは!'}
{'こんにちは!', '¡Hola!', 'Hello!', 'Привіт!'}
Set-Literale verwenden dieselben geschweiften Klammern wie dict-Literale. Um ein leeres set zu erstellen, musst du deshalb set() verwenden.
set() (der Konstruktor der set-Klasse) kannst du mit jedem iterable verwenden, das als Argument übergeben wird.
Die Elemente des iterable werden einzeln durchlaufen und dem set hinzugefügt.
Die Reihenfolge der Elemente bleibt nicht erhalten, Duplikate werden stillschweigend weggelassen:
# 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}
Wegen seines „Unpacking“-Verhaltens kann set() mit einem String überraschen:
# 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('अभ्यास')
{'अ', 'भ', 'य', 'स', 'ा', '्'}
Sets können verschiedene Datentypen und verschachtelte Datentypen enthalten, aber alle Elemente eines set müssen hashbar sein:
# 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'
Sets haben Methoden, die im Allgemeinen mathematische Mengenoperationen nachbilden.
Für die meisten (aber nicht alle) dieser Methoden gibt es einen Operator.
Methoden akzeptieren im Allgemeinen jedes iterable als Argument, Operatoren verlangen dagegen, dass beide Seiten der Operation sets oder frozensets sind.
Mit der Methode <set>.isdisjoint(<other_collection>) prüfst du, ob sich die Elemente eines set mit den Elementen eines anderen set überschneiden.
Die Methode akzeptiert jedes iterable oder set als Argument.
Sie gibt True zurück, wenn die beiden Sets keine gemeinsamen Elemente haben, und False, wenn es Überschneidungen gibt.
Einen Operator gibt es dafür nicht:
# 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
Mit <set>.issubset(<other_collection>) prüfst du, ob jedes Element in <set> auch in <other_collection> enthalten ist.
Die Operatorform ist <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>) ist die Umkehrung von .issubset().
Damit prüfst du, ob jedes Element in <other_collection> auch in <set> enthalten ist.
Die Operatorform ist <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>) gibt ein neues set mit den Elementen zurück, die sowohl im ursprünglichen set als auch in allen <others> vorkommen (mit anderen Worten: das set, in dem sich alles schneidet).
Die Operatorversion dieser Methode ist <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>) gibt ein neues set mit den Elementen aus <set> und allen <other iterables> zurück.
Die Operatorform dieser Methode ist <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>) gibt ein neues set mit den Elementen aus dem ursprünglichen <set> zurück, die nicht in <others> vorkommen.
Die Operatorversion dieser Methode ist <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>) gibt ein neues set zurück, das die Elemente enthält, die in <set> ODER <other> vorkommen, aber nicht in beiden.
Die Operatorversion dieser Methode ist <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)
{'🥭', '🌴', '🌵', '🍈', '🌲', '🥑'}
Eine symmetrische Differenz von mehr als zwei Sets ergibt ein set, das sowohl die Elemente enthält, die jeweils nur in einem set vorkommen, ALS AUCH Elemente, die von mehr als zwei Sets der Reihe gemeinsam genutzt werden (Details im Wikipedia-Artikel über die symmetrische Differenz).
Um nur die Einträge zu erhalten, die jeweils nur in einem set der Reihe vorkommen, müssen die Schnittmengen aller Zweierkombinationen in einem separaten Schritt zusammengefasst und entfernt werden:
>>> 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'}
Du und deine Geschäftspartner betreiben ein kleines Catering-Unternehmen. Ihr habt gerade zugesagt, eine Veranstaltung für einen lokalen Kochclub auszurichten, bei der „Club-Favoriten“-Gerichte serviert werden. Der Club hat wenig Erfahrung mit der Ausrichtung großer Veranstaltungen und braucht Hilfe bei der Organisation, beim Einkauf, bei der Vorbereitung und beim Servieren. Du hast beschlossen, ein paar kleine Python-Skripte zu schreiben, um den gesamten Planungsprozess zu beschleunigen.
Die Rezepte für die Veranstaltung wurden aus verschiedenen Quellen übernommen, und ihre Zutaten scheinen doppelte (oder mehr) Einträge zu haben. Du willst am Ende schließlich keine überzähligen Zutaten einkaufen! Bevor das Einkaufen und Kochen beginnen kann, muss die Zutatenliste jedes Gerichts „bereinigt“ werden.
Implementiere die Funktion clean_ingredients(<dish_name>, <dish_ingredients>), die den Namen eines Gerichts und eine list mit Zutaten entgegennimmt.
Diese Funktion sollte ein tuple zurückgeben, dessen erstes Element der Name des Gerichts ist, gefolgt von dem von Duplikaten befreiten set der Zutaten.
>>> 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'})
Die Veranstaltung wird sowohl Cocktails als auch „Mocktails“ umfassen, also Mixgetränke ohne Alkohol. Du musst sicherstellen, dass „Mocktail“-Getränke wirklich alkoholfrei sind und die Cocktails tatsächlich Alkohol enthalten.
Implementiere die Funktion check_drinks(<drink_name>, <drink_ingredients>), die den Namen eines Getränks und eine list mit Zutaten entgegennimmt.
Die Funktion sollte den Namen des Getränks gefolgt von „Mocktail“ zurückgeben, wenn das Getränk keine alkoholischen Zutaten enthält, und den Namen des Getränks gefolgt von „Cocktail“, wenn das Getränk Alkohol enthält.
Für diese Übung enthalten Cocktails nur Alkohole aus der Konstante ALCOHOLS in 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'
Die Gästeliste enthält Personen mit unterschiedlichen Ernährungsbedürfnissen, und dein Personal muss die Gerichte in Vegan, Vegetarian, Paleo, Keto und Omnivore aufteilen. Ein Gericht gehört nur dann zu einer Kategorie, wenn alle seine Zutaten in der Zutatenmenge der Kategorie vorkommen.
Implementiere die Funktion categorize_dish(<dish_name>, <dish_ingredients>), die einen Gerichtnamen und ein set mit den Zutaten dieses Gerichts entgegennimmt.
Die Funktion sollte einen String mit dem Format dish name: <CATEGORY> zurückgeben (zu welcher Kategorie das Gericht gehört).
Alle vorgegebenen Gerichte „passen“ in eine der Kategorien, die aus sets_categories_data.py importiert werden (VEGAN, VEGETARIAN, PALEO, KETO oder 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'
Einige Gäste haben Allergien und zusätzliche Ernährungseinschränkungen. Diese Zutaten müssen für jedes Gericht gekennzeichnet/annotiert werden, damit sie keine Probleme verursachen.
Implementiere die Funktion tag_special_ingredients(<dish>), die ein tuple entgegennimmt, an dessen erster Stelle der Name des Gerichts steht und an dessen zweiter Stelle eine list oder ein set mit den Zutaten dieses Gerichts.
Gib den Namen des Gerichts gefolgt von dem set der Zutaten zurück, die einen besonderen Hinweis in der Gerichtsbeschreibung erfordern.
Zutaten in einer list können Duplikate enthalten oder auch nicht.
Für diese Übung befinden sich alle Allergene oder speziellen Zutaten, die gekennzeichnet werden müssen, in der Konstante SPECIAL_INGREDIENTS, die aus sets_categories_data.py importiert wird.
>>> 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'})
Zur Vorbereitung auf das Bestellen und Einkaufen musst du eine „Master-Liste“ der Zutaten für alles auf der Speisekarte zusammenstellen (Mengen werden später ergänzt).
Implementiere die Funktion compile_ingredients(<dishes>), die eine list mit Gerichten entgegennimmt und ein Set aller Zutaten in allen aufgeführten Gerichten zurückgibt.
Jedes einzelne Gericht wird durch sein set an Zutaten dargestellt.
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'}
Die Gastgeber haben dir eine Liste mit Gerichten gegeben, die sie als „häppchengroße“ Vorspeisen für das Servieren auf Tabletts vorbereitet haben möchten. Du musst diese aus der Hauptliste der Gerichte herausziehen, die als größere Portionen zubereitet werden.
Implementiere die Funktion separate_appetizers(<dishes>, <appetizers>), die eine list mit Namen von Gerichten und eine list mit Namen von Vorspeisen entgegennimmt.
Die Funktion sollte die list der Gerichtnamen ohne die Vorspeisennamen zurückgeben.
Sowohl die list <dishes> als auch die list <appetizers> kann Duplikate enthalten und muss möglicherweise von Duplikaten befreit werden.
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']
Innerhalb jeder Kategorie (Vegan, Vegetarian, Paleo, Keto, Omnivore) wirst du die Zutaten herausziehen, die nur in einem einzigen Gericht vorkommen. Diese „Singleton“-Zutaten werden einem speziellen Einkäufer zugewiesen, damit sie in der Eile, alles andere zu erledigen, nicht vergessen werden.
Implementiere die Funktion singleton_ingredients(<dishes>, <INTERSECTIONS>), die eine list mit Gerichten und eine <CATEGORY>_INTERSECTIONS-Konstante für dieselbe Kategorie entgegennimmt.
Jedes Gericht wird durch ein set seiner Zutaten dargestellt.
Jede <CATEGORY>_INTERSECTIONS ist ein set von Zutaten, die in mehr als einem Gericht der Kategorie vorkommen.
Mithilfe von Mengenoperationen sollte deine Funktion ein set von „Singleton“-Zutaten zurückgeben (Zutaten, die nur in einem Gericht der Kategorie vorkommen).
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'}
Melde dich bei Exercism an, um Python mit 17 Konzepte146 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.