استخراج واستبدال العناصر التي تفي بشروط قائمة (مصفوفة) من السلاسل في بايثون

اعمال

لإنشاء قائمة جديدة من قائمة (مصفوفة) تكون عناصرها عبارة عن سلاسل ، عن طريق استخراج عناصر السلاسل التي تفي بشروط معينة فقط ، أو عن طريق إجراء عمليات استبدال وتحويلات وما إلى ذلك ، استخدم list comprehensions.

بعد شرح موجز لفهم القائمة ، يتم شرح المحتويات التالية بنموذج التعليمات البرمجية.

  • الاستخراج بناءً على ما إذا كان قد تم تضمين سلسلة معينة (مطابقة جزئية) أم لا
  • استبدل سلسلة محددة
  • استخرج بالبدء أو عدم البدء بسلسلة محددة
  • الاستخراج بالنهاية أو عدم الانتهاء بسلسلة معينة
  • يحكم ويستخرج حسب الدعوى
  • تحويل الأحرف الكبيرة والصغيرة
  • يحدد ما إذا كان يتم استخدام الأحرف الأبجدية أو الرقمية ويستخرجها
  • شروط متعددة
  • (كمبيوتر) تعبير عادي

لاحظ أن القوائم يمكن أن تخزن أنواعًا مختلفة من البيانات وتختلف تمامًا عن المصفوفات. إذا كنت تريد التعامل مع المصفوفات في العمليات التي تتطلب حجم الذاكرة وعناوين الذاكرة أو المعالجة الرقمية للبيانات الكبيرة ، فاستخدم مصفوفة (مكتبة قياسية) أو NumPy.

تدوين قائمة التضمين

عند إنشاء قائمة جديدة من قائمة ، فإن كتابة قائمة الإدراك أسهل من كتابة حلقات for.

[expression for any variable name in iterable object if conditional expression]

إذا كان العنصر سيتم تحديده فقط بواسطة تعبير شرطي ، فلن تتم معالجته بواسطة تعبير ، لذلك يأخذ النموذج التالي

[variable name for variable name in original list if conditional expression]

إذا تم تحويل التعبير الشرطي إذا لم يكن تعبيرًا شرطيًا ، فإنه يصبح نفيًا ، ويمكن استخراج العناصر التي لا تفي بالتعبير الشرطي.

يحتوي على سلسلة محددة (تطابق جزئي) \ لا يحتوي على:in

في “سلسلة محددة في السلسلة الأصلية” ، يتم إرجاع True إذا كانت السلسلة الأصلية تحتوي على السلسلة المحددة. هذا تعبير شرطي.

يتم نفي في مع ليس في.

l = ['oneXXXaaa', 'twoXXXbbb', 'three999aaa', '000111222']

l_in = [s for s in l if 'XXX' in s]
print(l_in)
# ['oneXXXaaa', 'twoXXXbbb']

l_in_not = [s for s in l if 'XXX' not in s]
print(l_in_not)
# ['three999aaa', '000111222']

استبدل سلسلة محددة

إذا كنت تريد استبدال سلسلة من عناصر القائمة ، فاستخدم طريقة السلسلة replace () لكل عنصر في تدوين list comprehension.

إذا لم يكن هناك سلسلة ليتم استبدالها ، فلا داعي لتحديد العنصر في التعبير الشرطي if لأنه لن يتم تغييره عن طريق تطبيق replace ().

l_replace = [s.replace('XXX', 'ZZZ') for s in l]
print(l_replace)
# ['oneZZZaaa', 'twoZZZbbb', 'three999aaa', '000111222']

إذا كنت تريد استبدال عنصر كامل يحتوي على سلسلة محددة ، فاستخرجه بـ في ومعالجته باستخدام عامل التشغيل الثلاثي. العامل الثلاثي مكتوب بالشكل التالي.
True Value if Conditional Expression else False Value

لا بأس إذا كان جزء التعبير في تدوين قائمة الفهم عاملًا ثلاثيًا.

l_replace_all = ['ZZZ' if 'XXX' in s else s for s in l]
print(l_replace_all)
# ['ZZZ', 'ZZZ', 'three999aaa', '000111222']

فيما يلي ملخص للنتائج محاطًا بأقواس. إذا لم تكن معتادًا على استخدام الأقواس ، فقد يكون من الأسهل فهم الأخطاء وتجنبها. نحويًا ، لا توجد مشكلة حتى لو كتبت أقواسًا.

[('ZZZ' if ('XXX' in s) else s) for s in l]

استخدام في كشرط محير مع تدوين القائمة في ، ولكن ليس من الصعب إذا كنت على دراية بالشكل النحوي لتدوين فهم القائمة والعوامل الثلاثية.

يبدأ بسلسلة محددة \ لا يبدأ:startswith()

يعود أسلوب السلسلة startswith () صحيحًا إذا بدأت السلسلة بالسلسلة المحددة في الوسيطة.

l_start = [s for s in l if s.startswith('t')]
print(l_start)
# ['twoXXXbbb', 'three999aaa']

l_start_not = [s for s in l if not s.startswith('t')]
print(l_start_not)
# ['oneXXXaaa', '000111222']

ينتهي بسلسلة أحرف معينة \ لا تنتهي:endswith()

طريقة السلسلة endswith () ترجع صحيحًا إذا كانت السلسلة تنتهي بالسلسلة المحددة في الوسيطة.

l_end = [s for s in l if s.endswith('aaa')]
print(l_end)
# ['oneXXXaaa', 'three999aaa']

l_end_not = [s for s in l if not s.endswith('aaa')]
print(l_end_not)
# ['twoXXXbbb', '000111222']

يحكم ويستخرج حسب الدعوى

يمكن استخدام طرق السلسلة isupper ()، islower () لتحديد ما إذا كانت السلسلة كلها أحرف كبيرة أم صغيرة.

l_lower = [s for s in l if s.islower()]
print(l_lower)
# ['three999aaa']

تحويل الأحرف الكبيرة والصغيرة

إذا كنت تريد تحويل جميع الأحرف إلى أحرف كبيرة أو صغيرة ، فاستخدم طرق السلسلة upper () و Lower (). تتضمن الطرق الأخرى استخدام الأحرف الكبيرة () ، والتي تجعل الحرف الأول فقط كبيرًا ، و swapcase () ، والتي تقوم بتبديل الأحرف الكبيرة والصغيرة.

كما في مثال الاستبدال أعلاه ، استخدم عامل التشغيل الثلاثي إذا كنت تريد معالجة العناصر التي تفي بالشرط فقط.

l_upper_all = [s.upper() for s in l]
print(l_upper_all)
# ['ONEXXXAAA', 'TWOXXXBBB', 'THREE999AAA', '000111222']

l_lower_to_upper = [s.upper() if s.islower() else s for s in l]
print(l_lower_to_upper)
# ['oneXXXaaa', 'twoXXXbbb', 'THREE999AAA', '000111222']

يحدد ما إذا كان يتم استخدام الأحرف الأبجدية أو الرقمية ويستخرجها

يمكن استخدام طرق السلسلة isalpha () و isnumeric () لتحديد ما إذا كانت السلسلة كلها أبجدية أو رقمية ، إلخ.

l_isalpha = [s for s in l if s.isalpha()]
print(l_isalpha)
# ['oneXXXaaa', 'twoXXXbbb']

l_isnumeric = [s for s in l if s.isnumeric()]
print(l_isnumeric)
# ['000111222']

شروط متعددة

يمكن أن يكون جزء التعبير الشرطي من قائمة الإدراك عبارة عن شروط متعددة. يمكن أيضًا استخدام الشروط السلبية “لا”.

عند استخدام ثلاثة تعبيرات شرطية أو أكثر ، يكون من الأكثر أمانًا إحاطة كل مجموعة بأقواس () لأن النتيجة ستختلف وفقًا للترتيب.

l_multi = [s for s in l if s.isalpha() and not s.startswith('t')]
print(l_multi)
# ['oneXXXaaa']

l_multi_or = [s for s in l if (s.isalpha() and not s.startswith('t')) or ('bbb' in s)]
print(l_multi_or)
# ['oneXXXaaa', 'twoXXXbbb']

(كمبيوتر) تعبير عادي

تسمح التعبيرات العادية بمعالجة عالية المرونة.

كائن المطابقة الذي تم إرجاعه بواسطة re.match () عندما يطابق دائمًا يتم تحديده ليكون صحيحًا عند تقييمه باستخدام تعبير شرطي. إذا لم يكن متطابقًا ، فإنه يُرجع بلا ، وهو خطأ في التعبير الشرطي. لذلك ، إذا كنت ترغب في استخراج العناصر التي تطابق التعبير العادي فقط ، فقم فقط بتطبيق re.match () على جزء التعبير الشرطي من تعبير list comprehension كما كان من قبل.

import re

l = ['oneXXXaaa', 'twoXXXbbb', 'three999aaa', '000111222']

l_re_match = [s for s in l if re.match('.*XXX.*', s)]
print(l_re_match)
# ['oneXXXaaa', 'twoXXXbbb']

re.sub () ، الذي يحل محل الجزء المطابق من التعبير العادي ، مفيد أيضًا. لاستخراج واستبدال العناصر المتطابقة فقط ، ما عليك سوى إضافة “تعبير شرطي”.

l_re_sub_all = [re.sub('(.*)XXX(.*)', r'\2---\1', s) for s in l]
print(l_re_sub_all)
# ['aaa---one', 'bbb---two', 'three999aaa', '000111222']

l_re_sub = [re.sub('(.*)XXX(.*)', r'\2---\1', s) for s in l if re.match('.*XXX.*', s)]
print(l_re_sub)
# ['aaa---one', 'bbb---two']