از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
پایتون: روش حذف کلید از دیکشنری
سرفصلهای مطلب
معرفی
در این مقاله نگاهی خواهیم داشت روش حذف کلیدها از دیکشنری پایتون. این را می توان با pop()
تابع، del
کلمه کلیدی، و با درک دیکت.
حذف یک کلید با استفاده از پاپ (کلید، د)
را pop(key, d)
تابع یک کلید را از دیکشنری حذف می کند و مقدار آن را برمی گرداند. دو آرگومان نیاز دارد، کلید حذف میشود و اگر کلید پیدا نشد، مقدار اختیاری باز میگردد. در اینجا مثالی از ظاهر کردن یک عنصر با تنها موارد مورد نیاز آورده شده است key
بحث و جدل:
my_dict = {1: "a", 2: "b"}
popped_value = my_dict.pop(1)
line = "The value removed from the dictionary of the key: 1 is {}"
print(line.format(popped_value))
این قطعه خروجی زیر را برمی گرداند:
The value removed from the dictionary of the key: 1 is a
اکنون، مشاهده کنید وقتی میخواهیم کلیدی را که وجود ندارد حذف کنیم چه اتفاقی میافتد:
my_dict = {1: "a", 2: "b"}
popped_value = my_dict.pop(3)
line = "The value removed from the dictionary of the key: 3 is {}"
print(line.format(popped_value))
این امر الف را بالا می برد خطای کلیدی، همانطور که انتظار می رود زیرا وجود ندارد:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 3
اگر تماس بگیرید pop()
روی کلیدی که وجود ندارد، پایتون a را برمی گرداند KeyError
. پس فقط استفاده کنید pop(key)
اگر مطمئن هستید که کلید در فرهنگ لغت وجود دارد.
اگر مطمئن نیستید که کلید وجود دارد یا خیر، یک مقدار برای آرگومان دوم اختیاری برای قرار دهید pop()
– مقدار پیش فرض به جای پرتاب الف خطای کلیدی آن مقدار را برمی گرداند.
قطعه فوق را می توان به صورت زیر بازنویسی کرد:
my_dict = {1: "a", 2: "b"}
removed_value = my_dict.pop(3, None)
line = "The value removed from the dictionary of the key: 3 is {}"
print(line.format(removed_value))
و حالا وقتی آن را اجرا می کنیم خطایی نمی دهد:
The value removed from the dictionary of the key: 3 is None
حذف یک کلید با استفاده از دل دیکت (کلید)
راه دیگر برای حذف کلید از دیکشنری از طریق del
کلمه کلیدی. این کلمه کلیدی می تواند هر شی را حذف کند. همچنین میتواند یک جفت کلید-مقدار از دیکشنری مانند زیر را حذف کند: del dict_name(key)
:
my_dict = {1: "a", 2: "b"}
del my_dict(1)
line = "The dictionary after deletion is {}"
print(line.format(my_dict))
قطعه بالا خروجی زیر را برمیگرداند و فرهنگ لغت را فقط با مقدار(های) خارج شده نشان میدهد:
The dictionary after deletion is {2: 'b'}
بر خلاف pop()
، هنگام حذف هیچ مقداری برگردانده نمی شود. اگر به دنبال حفظ ورودی فرهنگ لغت موجود هستید، می توانید بخش بعدی را مفید بیابید.
کلیدهای دیکشنری متعدد را با درک دیکته بردارید
روش های قبلی یک دیکشنری را در محل به روز می کنند، به این معنی که جفت کلید-مقدار از بین می رود. اگر کلید اصلی باید حفظ شود، میتوانیم از یک تابع سفارشی برای این کار استفاده کنیم. در پایتون، معمولاً میدانیم که میتوانیم از درک لیست برای ایجاد یک لیست جدید استفاده کنیم روی موجود ما می توانیم همین کار را با دیکشنری ها با استفاده از درک دیکت انجام دهیم.
بنابراین به جای حذف مقادیر در یک لیست، میتوانیم از یک dict comprehension برای ایجاد یک فرهنگ لغت جدید با شرطی استفاده کنیم که مقادیری را که نمیخواهیم حذف کنیم.
مثال زیر را در نظر بگیرید که در آن یک فرهنگ لغت جدید ایجاد می کنیم که کلید آن را ندارد 1
:
my_dict = {1: "a", 2: "b"}
my_dict2 = {k: v for k, v in my_dict.items() if k != 1}
line = "The new dictionary is {}"
print(line.format(my_dict2))
این قطعه خروجی زیر را تولید می کند و فرهنگ لغت جدید را چاپ می کند:
The new dictionary is {2: 'b'}
توجه داشته باشید که ما در حال ایجاد یک فرهنگ لغت جدید هستیم که به میزان مصرف حافظه برنامه خود اضافه می کند. اگر تعداد زیادی از اعضا را حذف نکنیم، برای دیکشنریهایی با اندازههای بزرگتر، تقریباً حافظه مورد استفاده برای آن دادهها را دو برابر میکنیم.
کارایی عملکرد محک
ما تاکنون سه روش را مشاهده کرده ایم. اما کدام روش در بین این سه روش سریعتر است؟
بیایید یک فرهنگ لغت تصادفی ایجاد کنیم روی که ما روش های خود را آزمایش خواهیم کرد. تابع زیر gen_random_dict(n)
یک لیست را به عنوان آرگومان می گیرد و یک فرهنگ لغت با اعداد صحیح دانه دار تصادفی ایجاد می کند:
import random
def gen_random_dict(n):
random.seed(0)
mydict = {}
for i in range(n):
nmbr = random.randrange(1, n, 1)
mydict(nmbr) = "value "+ str(nmbr)
return mydict
در همین فایل، اجازه دهید برخی از توابع را اضافه کنیم که یک کلید را به هر یک از روشهایی که بحث کردیم حذف میکنند:
def remove_using_pop(dict_input):
dict_input.pop(1)
return None
def remove_using_del(dict_input):
del dict_input(1)
return None
def remove_using_condition(dict_input):
return {k: v for k, v in dict_input.items() if k != 1}
در نهایت کد زیر را که از کد استفاده می کند اضافه کنید timeit
ماژولی که زمان اجرای کد ما را اندازه گیری می کند:
import timeit
if __name__ == "__main__":
func_to_be_tested = "remove_using_pop(gen_random_dict(10000))"
setup_stmt = "from __main__ import remove_using_pop, gen_random_dict"
runtime1 = timeit.timeit(func_to_be_tested, setup=setup_stmt, number=1)
func_to_be_tested = "remove_using_del(gen_random_dict(10000))"
setup_stmt = "from __main__ import remove_using_del, gen_random_dict"
runtime2 = timeit.timeit(func_to_be_tested, setup=setup_stmt, number=1)
func_to_be_tested = "remove_using_condition(gen_random_dict(10000))"
setup_stmt = "from __main__ import remove_using_condition, gen_random_dict"
runtime3 = timeit.timeit(func_to_be_tested, setup=setup_stmt, number=1)
print("Runtime for removing key from Dict:")
print("\t1) Using Pop: {}".format(str(runtime1)))
print("\t2) Using Del: {}".format(str(runtime2)))
print("\t3) Using Condition: {}".format(str(runtime3)))
در حالی که نتایج ممکن است متفاوت باشد روی کامپیوتر شما، الگو باید سازگار باشد. این خروجی پس از اجرای این اسکریپت است:
Runtime for removing key from Dict:
1) Using Pop: 0.015606499999194057
2) Using Del: 0.01090950000070734
3) Using Condition: 0.011443700001109391
با استفاده از del
کلمه کلیدی نسبت به بقیه روش ها برتری دارد. اگرچه به نظر می رسد که تفاوت زمانی چندان چشمگیر نیست روی دیکشنری های کوچکتر اگرچه، زمانی که اندازه فرهنگ لغت بزرگ باشد، تأثیر زیادی خواهد داشت.
نتیجه
در این مقاله، سه روش را یاد گرفتیم که به وسیله آنها می توان یک جفت کلید-مقدار را از فرهنگ لغت حذف کرد – pop()
، del
، و درک ها را دیکته کنید. انتخاب روش مناسب برای اندازه مناسب فرهنگ لغت می تواند به کاهش زمان اجرای اسکریپت و استفاده از حافظه کمک کند.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-12 11:46:03