مجموعة بلا تكرار
تحتفظ المجموعة (set) بكل قيمة مرة واحدة على الأكثر وليس لها مواضع: {"AAPL", "MSFT", "GOOG"}. إضافة قيمة موجودة لا تغيّر شيئًا. تحوّل set(items) أي كائن قابل للتكرار إلى مجموعة، وهي أسرع طريقة لإزالة التكرارات، ثم تعدّ len القيم المختلفة. وبما أنه لا ترتيب للمجموعة فلا يمكن فهرستها، ولا يُعتمد على الترتيب الذي تراه عند طباعتها. المجموعة الفارغة هي set(): أما {} فقاموس فارغ.
symbols = ["AAPL", "MSFT", "AAPL", "GOOG", "MSFT"]
# set() removes repeats
unique = set(symbols)
print(len(symbols), len(unique)) # 5 3
# Adding something already there changes nothing
unique.add("AAPL")
unique.add("TSLA")
print(len(unique)) # 4
# {} is a dict; an empty set is set()
print(type({}), type(set())) # <class 'dict'> <class 'set'>اختبارات انتماء سريعة
يجيب x in some_set تقريبًا فورًا حتى مع ملايين القيم لأن المجموعة تجد القيمة بتجزئتها بدل أن تفحص كل شيء. أما الاختبار نفسه على قائمة فيفحص العناصر واحدًا واحدًا ويبطؤ كلما كبرت القائمة. لذا إذا سألت بـin مرارًا عن المجموعة نفسها، كفحص كل أمر وارد مقابل قائمة رموز محظورة، فحوّلها إلى مجموعة مرة واحدة. ويجب أن تكون عناصر المجموعة قابلة للتجزئة كمفاتيح القاموس.
# Membership: a set is the fast structure for "is it in there?"
banned = {"GME", "AMC", "BBBY"}
orders = ["AAPL", "GME", "MSFT", "AMC"]
allowed = [symbol for symbol in orders if symbol not in banned]
print(allowed) # ['AAPL', 'MSFT']
# Sets only keep hashable values
try:
{["AAPL"]}
except TypeError as error:
print("not hashable:", error)عمليات المجموعات
تُركَّب المجموعات كما في الرياضيات. a | b هو الاتحاد (في أيٍّ منهما)، وa & b التقاطع (في كليهما)، وa - b الفرق (في a وليس في b)، وa ^ b الفرق المتماثل (في واحدة فقط). ولكل منها دالة أيضًا مثل a.union(b) التي تقبل أي كائن قابل للتكرار. وكلها تُرجع مجموعة جديدة وتترك a وb كما هما. وهذا بالضبط ما تحتاجه لمقارنة عالمين من الرموز أو قائمتين من المراكز.
# Comparing yesterday's and today's universe
yesterday = {"AAPL", "MSFT", "GOOG", "IBM"}
today = {"AAPL", "MSFT", "TSLA"}
print(sorted(yesterday | today)) # ['AAPL', 'GOOG', 'IBM', 'MSFT', 'TSLA']
print(sorted(yesterday & today)) # ['AAPL', 'MSFT']
print(sorted(today - yesterday)) # ['TSLA'] (new listings)
print(sorted(yesterday - today)) # ['GOOG', 'IBM'] (dropped)
print(sorted(yesterday ^ today)) # ['GOOG', 'IBM', 'TSLA']تعديل مجموعة والحفاظ على الترتيب
تُدرج add(x) قيمة، وتُدرج update(items) عدة قيم، وتزيل discard(x) قيمة إن وُجدت (بصمت)، وتزيلها remove(x) لكنها ترفع KeyError إن لم تكن موجودة. المجموعة تنسى الترتيب، فإذا كان الترتيب مهمًا فتحتاج قائمة: sorted(some_set) تعطي قائمة مرتّبة، ولإزالة التكرار مع الحفاظ على ترتيب أول ظهور، مرّ على القيم وتذكّر ما رأيته في مجموعة (seen). وهذا الفحص سريع لأنه على مجموعة.
# Remove repeats and keep the first-seen order
symbols = ["MSFT", "AAPL", "MSFT", "GOOG", "AAPL"]
seen = set()
ordered = []
for symbol in symbols:
if symbol not in seen:
seen.add(symbol)
ordered.append(symbol)
print(ordered) # ['MSFT', 'AAPL', 'GOOG']
# discard is quiet, remove is strict
seen.discard("TSLA")
try:
seen.remove("TSLA")
except KeyError:
print("TSLA was not in the set")sorted(...) لتحصل على قائمة ثابتة. وتطلب المختبرات قوائم مرتّبة لهذا السبب بالتحديد.set(items): الاحتفاظ بكل قيمة مرة واحدة؛ وlen(set(items))تعدّ القيم المختلفة.x in sسريع؛ وa | bوa & bوa - bوa ^ bتبني مجموعات جديدة.- المجموعات بلا ترتيب: استخدم
sorted(s)عندما تحتاج قائمة.
التالي: قراءة ملفات النص وكتابتها، لتحتفظ برامجك بالبيانات بين مرات التشغيل.
المختبر: ما الذي يُقيَّم
- عُدّ الرموز المختلفة باستخدام
distinct_count25 نقطة - اكتشف الرموز التي ظهرت حديثًا باستخدام
new_listings25 نقطة - اعثر على ما تشترك فيه محفظتان باستخدام
common_symbols25 نقطة - أزل التكرارات مع الحفاظ على الترتيب باستخدام
dedupe_keep_order25 نقطة