استخراج و جایگزینی عناصری که شرایط یک لیست (آرایه) رشته ها در پایتون را برآورده می کنند.

کسب و کار

برای تولید یک لیست جدید از یک لیست (آرایه) که عناصر آن رشته هستند، تنها با استخراج عناصر رشته هایی که شرایط خاصی را برآورده می کنند، یا با انجام تعویض، تبدیل و غیره، از درک لیست استفاده کنید.

پس از توضیح مختصری در مورد درک لیست، مطالب زیر با نمونه کد توضیح داده شده است.

  • استخراج بر اساس اینکه یک رشته خاص گنجانده شده است یا نه (تطابق جزئی)
  • رشته خاصی را جایگزین کنید
  • با شروع یا عدم شروع با یک رشته خاص استخراج کنید
  • با پایان دادن یا عدم پایان دادن به یک رشته خاص استخراج کنید
  • مورد قضاوت و استخراج قرار گرفت
  • تبدیل حروف بزرگ و کوچک
  • تعیین می کند که آیا از حروف الفبا یا عددی استفاده شده است و آنها را استخراج می کند
  • شرایط چندگانه
  • (کامپیوتری) عبارت منظم

توجه داشته باشید که لیست ها می توانند انواع مختلفی از داده ها را ذخیره کنند و کاملاً با آرایه ها متفاوت هستند. اگر می‌خواهید آرایه‌هایی را در فرآیندهایی مدیریت کنید که به اندازه حافظه و آدرس‌های حافظه یا پردازش عددی داده‌های بزرگ نیاز دارند، از آرایه (کتابخانه استاندارد) یا NumPy استفاده کنید.

نماد گنجاندن لیست

هنگام ایجاد یک لیست جدید از یک لیست، نوشتن درک لیست ساده تر از حلقه ها است.

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

اگر عنصر فقط با یک عبارت شرطی انتخاب شود، توسط یک عبارت پردازش نمی‌شود، بنابراین شکل زیر را به خود می‌گیرد.

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

اگر عبارت شرطی if به یک عبارت شرطی اگر نه تبدیل شود، به نفی تبدیل می شود و عناصری که عبارت شرطی را برآورده نمی کنند، می توانند استخراج شوند.

شامل یک رشته خاص (تطابق جزئی) \ حاوی نیست:in

در “رشته خاص در رشته اصلی”، اگر رشته اصلی حاوی رشته خاصی باشد، مقدار True را برمی گرداند. این یک عبارت شرطی است.

نفی in با not in انجام می شود.

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']

رشته خاصی را جایگزین کنید

اگر می خواهید رشته ای از عناصر لیست را جایگزین کنید، از متد string ()replace برای هر عنصر در نماد درک لیست استفاده کنید.

اگر رشته ای برای جایگزینی وجود نداشته باشد، نیازی به انتخاب عنصر در عبارت شرطی if نیست زیرا با اعمال ()replace تغییر نخواهد کرد.

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

اگر می‌خواهید کل عنصری را که حاوی یک رشته خاص است جایگزین کنید، آن را با in استخراج کرده و با عملگر سه تایی پردازش کنید. عملگر سه تایی به شکل زیر نوشته می شود.
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]

استفاده از in به عنوان یک شرط با نماد درک لیست در گیج کننده است، اما اگر از شکل نحوی نماد درک لیست و عملگرهای سه تایی آگاه باشید، دشوار نیست.

با یک رشته خاص شروع می شود \ شروع نمی شود:startswith()

اگر رشته با رشته مشخص شده در آرگومان شروع شود، متد string startswith() true را برمی گرداند.

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()

اگر رشته با رشته مشخص شده در آرگومان خاتمه یابد، متد string endswith() true را برمی‌گرداند.

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 و low () استفاده کنید. متدهای دیگر عبارتند از ()capitalize که فقط حرف اول را بزرگ می کند و 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() برگردانده می‌شود، زمانی که با یک عبارت شرطی ارزیابی می‌شود، همیشه درست است. اگر مطابقت نداشته باشد، None را برمی گرداند که در عبارت شرطی نادرست است. بنابراین، اگر می‌خواهید فقط عناصری را استخراج کنید که با عبارت معمولی مطابقت دارند، فقط re.match() را به قسمت عبارت شرطی عبارت درک لیست مانند قبل اعمال کنید.

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()، که جایگزین بخش همسان یک عبارت منظم می شود، نیز مفید است. برای استخراج و جایگزینی فقط عناصر منطبق، فقط ” if conditional expression” را اضافه کنید.

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']