إن المجموعة هي تجميعة قابلة للتعديل و_غير مرتبة_ من الكائنات القابلة للتجزئة.
يجب أن تكون عناصر المجموعة متميزة، فلا يُسمح بالعناصر المكررة.
ويمكنها أن تحمل أنواع بيانات مختلفة متعددة، وحتى بنى متداخلة مثل 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 وكذلك عناصر مشتركة بين أكثر من مجموعتين في السلسلة (التفاصيل في مقال ويكيبيديا عن الفرق المتماثل).
للحصول على العناصر الفريدة فقط لكل 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'}
أنت وشركاؤك في العمل تديرون شركة صغيرة لتقديم الطعام. لقد وافقت للتو على تنظيم فعالية لنادٍ محلي للطبخ تقدّم أطباقًا من "مفضّلات النادي". النادي قليل الخبرة في استضافة الفعاليات الكبيرة، ويحتاج إلى المساعدة في التنظيم والتسوّق والتحضير والتقديم. وقد قررت كتابة بعض البرامج النصية الصغيرة بلغة 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'})
ستتضمّن الفعالية كوكتيلات و"موكتيلات"، وهي مشروبات مخلوطة بدون الكحول. عليك التأكد من أن مشروبات "الموكتيل" خالية فعلًا من الكحول، وأن الكوكتيلات تحتوي بالفعل على الكحول.
نفّذ الدالة 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 بأسماء الأطباق بعد إزالة أسماء المقبّلات. قد تحتوي قائمة <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_ingredients(<dishes>, <INTERSECTIONS>) التي تأخذ list من الأطباق وثابتًا <CATEGORY>_INTERSECTIONS للفئة نفسها. يُمثَّل كل طبق بـset مكوّناته. كل <CATEGORY>_INTERSECTIONS هو set من المكوّنات التي تظهر في أكثر من طبق واحد في الفئة. باستخدام عمليات المجموعات، يجب أن تُرجع الدالة set من المكوّنات "المفردة" (أي المكوّنات التي تظهر في طبق واحد فقط ضمن الفئة).
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 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.