group_by و partition
جزء من قسم المنطق وتدفق العمليات في رحلة Ruby على Coddy. الدرس 25 من 56.
في بعض الأحيان قد ترغب في تقسيم مجموعة بدلاً من تصفيتها. هناك طريقتان تغطيان معظم الحالات.
تأخذ group_by كتلًا برمجية (block) وترجع تجزئة (hash). يصبح كل ناتج فريد للكتلة البرمجية مفتاحًا، والذي يرتبط بمصفوفة من العناصر التي أنتجته:
words = ["hi", "hello", "yo", "hey", "bonjour"]
by_length = words.group_by { |w| w.length }
puts by_length.inspect
# {2=>["hi", "yo"], 5=>["hello"], 3=>["hey"], 7=>["bonjour"]}إنها الطريقة الأكثر وضوحاً لتجميع العناصر في خضوع واحد (pass).
تُعدّ partition النسخة الثنائية: فهي تُرجع زوجًا من المصفوفات، العناصر التي كانت كتلة الكود معها صحيحة (true)، والبقية:
evens, odds = [1, 2, 3, 4, 5].partition { |n| n.even? }
puts evens.inspect # [2, 4]
puts odds.inspect # [1, 3, 5]استخدم partition عندما يكون هناك مجموعتان بالضبط، و group_by عندما يكون هناك العديد من المجموعات.
التحدي
متوسطاقرأ قائمة مفصولة بفاصلة من مدخلات name:score (على سبيل المثال Alice:88,Bob:42,Charlie:75). استخدم group_by متبوعة بـ partition لإنشاء تقرير صغير.
الخطوات:
- حلل كل إدخال إلى زوج
[name, score](بحيث تكون النتيجة عددًا صحيحًا) - استخدم
group_byبحسب الحرف الأول منnameللزوج (بحرف كبير) - لكل مجموعة أحرف، بترتيب أبجدي (
alphabetical)، قم بـpartitionللمدخلات إلى ناجح (score >= 60) وراسب، ثم اطبع سطرًا واحدًا لكل مجموعة:
<LETTER>: pass=<names_passing_joined_by_comma> fail=<names_failing_joined_by_comma>ضمن كل مجموعة، تظهر الأسماء بترتيبها الأصلي. إذا لم يحتوي أي جانب على أسماء، اتركه فارغًا (على سبيل المثال fail=).
بالنسبة للمدخلات Alice:88,Adam:42,Bob:75,Beth:55,Cara:90، تكون المخرجات:
A: pass=Alice fail=Adam
B: pass=Bob fail=Beth
C: pass=Cara fail=جرّب بنفسك
entries = gets.chomp.split(",").map do |s|
name, score = s.split(":")
[name, score.to_i]
end
# TODO: جمّع حسب الحرف الأول (كبير)، قسّم كل مجموعة حسب الدرجة >= 60،
# اطبع 'X: pass=... fail=...' بترتيب الحروف الأبجدي
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفق العمليات
1السلاسل النصية بعمق
نظرة عامة على أساليب السلاسل النصيةاستيفاء السلاسل النصيةالتكرار عبر السلاسل النصيةالتقسيم والضممراجعة - ناسج السلاسل النصية4Blocks، Procs و Lambdas
ما هي الكتلة؟do..end مقابل الأقواس المعقوفةالكلمة المفتاحية yieldمعاملات الكتلةProcs و Lambdasمراجعة - مكرّر مخصّص7Hashes - الجزء الثاني
Hash.new مع القيم الافتراضيةالتكرار عبر HashesHashes متداخلةالدمج والتحويلمراجعة - عدّاد التكرار10مشروع - سجلات الطلاب
نظرة عامة على المشروعإضافة طالب5قوة Enumerable
Select و Rejectتسلسل MapReduce / Injectcount، all?، any?، none?group_by و partitionsort_by، min_by، max_byمراجعة - خط أنابيب البيانات3المصفوفات ثنائية الأبعاد
أساسيات المصفوفات ثنائية الأبعادالوصول إلى عناصر المصفوفات ثنائية الأبعادالتكرار عبر المصفوفات ثنائية الأبعادالأنماط الشائعة للمصفوفات ثنائية الأبعادمراجعة - عمليات المصفوفات6المشروع - مدير المكتبة
نظرة عامة على المشروعإضافة كتابتدرّب بنفسك: مترجم Ruby عبر الإنترنت