از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
یکپارچگی داده: چگونه OrderedDict نظم کلیدی را در پایتون حفظ می کند
سرفصلهای مطلب
معرفی
یکپارچگی داده ها جنبه مهمی از برنامه نویسی است که دقت، سازگاری و قابلیت اطمینان داده ها را در طول چرخه عمر آن تضمین می کند. این امر به ویژه هنگامی که با ساختارهای داده و الگوریتم های پیچیده سروکار داریم، اهمیت دارد.
با حفظ یکپارچگی داده ها، می توانیم به سازگاری و صحت اطلاعات خود اعتماد کنیم process و ذخیره کنید.
وقتی صحبت از فرهنگ لغت در پایتون می شود، استاندارد است dict
نوع فوق العاده همه کاره و به طور گسترده استفاده می شود. با این حال، فرهنگ لغت های معمولی همیشه حفظ نظم کلید را تضمین نمی کنند.
این می تواند در سناریوهایی که حفظ ترتیب عناصر برای عملکرد صحیح کد ما بسیار مهم است مشکل ساز شود.
بنابراین، در این مقاله، محدودیتهای دیکشنری استاندارد در پایتون را بررسی میکنیم و خواهیم دید که چگونه میتوانیم آنها را با استفاده از OrderedDict
زیر کلاس
بررسی محدودیت های دیکشنری های منظم در پایتون
بیایید مثالی را در نظر بگیریم که در آن حفظ ترتیب کلید مهم است، مانند پردازش فایلهای پیکربندی.
فایلهای پیکربندی اغلب از جفتهای کلید-مقدار تشکیل شدهاند و ترتیب کلیدها اولویت (یا ترتیب) اقداماتی را که باید انجام شود، تعیین میکند. اگر کلیدها حفظ نشوند، ممکن است پیکربندی اشتباه تفسیر شود و منجر به رفتار نادرست یا نتایج غیرمنتظره شود.
اکنون، اجازه دهید با ایجاد و اجرای یک فرهنگ لغت، محدودیتهای دیکشنریهای معمولی در پایتون را بررسی کنیم:
config = {}
config('b') = 2
config('a') = 1
config('c') = 3
for key, value in config.items():
print(key, value)
و دریافت می کنیم:
a 1
b 2
c 3
در این مثال، ترتیب کلیدها در خروجی منطبق با ترتیب اضافه شدن آنها تضمین نمی شود. اگر حفظ نظم ضروری است، استفاده از یک فرهنگ لغت معمولی غیر قابل اعتماد می شود.
برای غلبه بر این محدودیت و اطمینان از یکپارچگی داده ها، پایتون این موارد را فراهم می کند OrderedDict
زیر کلاس از ماژول مجموعه ها. ترتیب درج کلیدها را حفظ می کند و به ما این امکان را می دهد process داده ها با اطمینان از اینکه سفارش حفظ می شود.
توجه داشته باشید: در نظر بگیرید که از نسخه 3.7، پایتون دیکشنری هایی ارائه می دهد که جفت های مرتب شده کلید-مقدار را برمی گرداند. ما یک بحث مختصر خواهیم داشت روی این در پایان مقاله با این حال، ویژگی های منحصر به فرد از OrderedDict
هنوز هم بسیار مفید هستند و در این مقاله، دلیل آن را خواهیم دید. در نهایت، اگر بخواهیم نسخه پایتون خود را تأیید کنیم، میتوانیم آن را باز کنیم terminal و تایپ کنید: $ python --version
معرفی OrderedDict به عنوان راه حلی برای حفظ نظم کلید
در اینجا روش استفاده از آن آمده است OrderedDict
زیر کلاس برای حفظ جفت های مرتب شده کلید-مقدار:
from collections import OrderedDict
config = OrderedDict()
config('b') = 2
config('a') = 1
config('c') = 3
for key, value in config.items():
print(key, value)
و دریافت می کنیم:
b 2
a 1
c 3
در این حالت، خروجی ترتیب اضافه شدن کلیدها را نشان می دهد OrderedDict
، اطمینان از حفظ یکپارچگی داده ها.
کاوش در ویژگی های منحصر به فرد OrderedDict
اکنون، بیایید ویژگی های منحصر به فرد را بررسی کنیم OrderedDict
، که صرف نظر از نسخه پایتونی که ما استفاده می کنیم مفید هستند.
یک مورد را به پایان یا ابتدای یک دیکشنری مرتب شده منتقل کنید
یکی از ویژگی های مفید و جالب از OrderedDict
امکان انتقال یک مورد به انتهای یا ابتدای یک فرهنگ لغت سفارش داده شده است.
بیایید ببینیم چگونه این کار را انجام دهیم:
from collections import OrderedDict
ordered_dict = OrderedDict()
ordered_dict('c') = 3
ordered_dict('a') = 1
ordered_dict('b') = 2
ordered_dict.move_to_end('a')
print(ordered_dict)
و دریافت می کنیم:
OrderedDict((('c', 3), ('b', 2), ('a', 1)))
و بنابراین، ما عنصر ‘a’ را به انتهای فرهنگ لغت منتقل کرده ایم و عناصر دیگر را در همان موقعیت ها نگه می داریم.
بیایید ببینیم چگونه می توانیم یک عنصر را به ابتدای یک فرهنگ لغت مرتب منتقل کنیم:
from collections import OrderedDict
ordered_dict = OrderedDict()
ordered_dict('a') = 1
ordered_dict('b') = 2
ordered_dict('c') = 3
ordered_dict.move_to_end('c', last=False)
print(ordered_dict)
و دریافت می کنیم:
OrderedDict((('c', 3), ('a', 1), ('b', 2)))
بنابراین، ما مورد ‘c’ را به ابتدای فرهنگ لغت منتقل کرده ایم، و بقیه موارد را در موقعیت های خود باقی می گذاریم.
توجه داشته باشید که ما از روش استفاده کرده ایم move_to_end()
مانند قبل، اما در این مورد باید از آن عبور کنیم last=False
پارامتر.
بیرون آمدن آیتم ها از یک دیکشنری سفارشی
فرض کنید یک دیکشنری سفارشی داریم و می خواهیم اولین یا آخرین مورد را از آن حذف کنیم. همانطور که در زیر نشان داده شده است می توانیم تنها با یک خط کد به این نتیجه برسیم:
from collections import OrderedDict
ordered_dict = OrderedDict()
ordered_dict('a') = 1
ordered_dict('b') = 2
ordered_dict('c') = 3
key, value = ordered_dict.popitem(last=True)
print(f"Removed item: ({key}, {value})")
print(ordered_dict)
و دریافت می کنیم:
Removed item: (c, 3)
OrderedDict((('a', 1), ('b', 2)))
و البته اگر پارامتر را پاس کنیم last=False
به popitem()
روش، اولین مورد از فرهنگ لغت سفارش داده شده را حذف می کند.
تکرار به ترتیب معکوس در یک فرهنگ لغت مرتب
تضمین یکپارچگی ترتیب جفتهای کلید-مقدار با OrderedDict
توانایی تکرار از طریق یک فرهنگ لغت مرتب شده به ترتیب معکوس را فراهم می کند، زیرا ما مطمئن هستیم که موقعیت ها حفظ می شوند.
در اینجا روش انجام این کار آمده است:
from collections import OrderedDict
ordered_dict = OrderedDict()
ordered_dict('a') = 1
ordered_dict('b') = 2
ordered_dict('c') = 3
for key, value in reversed(ordered_dict.items()):
print(key, value)
و دریافت می کنیم:
c 3
b 2
a 1
بنابراین، روش reversed()
می توان از آن برای معکوس کردن آیتم های یک فرهنگ لغت استفاده کرد و با توجه به این واقعیت که ما از یک فرهنگ لغت مرتب استفاده می کنیم، می توانیم آن را از آخرین مورد به اولین مورد تکرار کنیم.
توجه داشته باشید که در حالی که از یک مثال اساسی برای نشان دادن روش تکرار به ترتیب معکوس استفاده کرده ایم، این روش می تواند در موارد عملی مانند:
- تاریخچه معاملات. فرض کنید ما در حال پیاده سازی یک سیستم تاریخچه تراکنش هستیم، که در آن هر تراکنش در یک فرهنگ لغت سفارش داده شده با یک شناسه تراکنش منحصر به فرد به عنوان کلید و جزئیات تراکنش به عنوان مقدار ذخیره می شود. تکرار به ترتیب معکوس به ما امکان دسترسی به و را می دهد process اولین تراکنش های اخیر، که می تواند برای تولید گزارش یا انجام تجزیه و تحلیل مفید باشد.
- پردازش گزارش رویداد. هنگام کار با گزارشهای رویداد یا فایلهای گزارش، میتوان از فرهنگ لغت سفارشدادهشده برای ذخیره مدخلهای گزارش استفاده کرد، جایی که مُهر زمان بهعنوان کلید و جزئیات گزارش بهعنوان مقدار عمل میکند. تکرار به ترتیب معکوس به ما امکان می دهد ورودی های گزارش را از آخرین رویدادها تا قدیمی ترین آنها را تجزیه و تحلیل کنیم، که می تواند به اشکال زدایی، شناسایی الگوها یا تولید خلاصه کمک کند.
نمایش موارد استفاده از OrderedDict
تاکنون شاهد پیادهسازی ویژگیهای زیر کلاس «OrderedDict» بودهایم. حال، بیایید چند سناریو عملی و واقعی را ببینیم که ممکن است نیاز به داشتن فرهنگ لغت با موارد سفارش داده شده داشته باشیم.
حفظ ترتیب ستون CSV
هنگام خواندن یک فایل CSV (مقدار جدا شده با کاما) با ردیف سرصفحه، ممکن است بخواهیم ترتیب ستون ها را در حین پردازش داده ها حفظ کنیم.
بیایید نمونه ای از روش استفاده را ببینیم OrderedDict
در اینگونه موارد.
فرض کنید یک فایل CSV به نام داریم data.csv
با داده های زیر:
Name,Age,City
John,25,New York
Alice,30,San Francisco
Bob,35,Chicago
اکنون میتوانیم یک اسکریپت پایتون بنویسیم که فایل CSV را باز میکند، آن را میخواند و آنچه داخل آن است چاپ میکند و نظم را حفظ میکند. ما می توانیم این کار را به این صورت انجام دهیم:
import csv
from collections import OrderedDict
filename = 'data.csv'
with open(filename, 'r') as file:
reader = csv.DictReader(file)
for row in reader:
ordered_row = OrderedDict(row)
for column, value in ordered_row.items():
print(f"{column}: {value}")
print('---')
و دریافت می کنیم:
Name: John
Age: 25
City: New York
---
Name: Alice
Age: 30
City: San Francisco
---
Name: Bob
Age: 35
City: Chicago
---
حفظ ترتیب کلید JSON
اشیاء JSON، به طور پیشفرض، ترتیب خاصی را برای کلیدهای خود تضمین نمیکنند. با این حال، اگر نیاز به تولید دادههای JSON با کلیدها به ترتیب خاصی داشته باشیم، OrderedDict
می تواند مفید باشد.
بیایید یک مثال را ببینیم.
ما یک شی JSON ایجاد می کنیم که نام، سن و شهر یک شخص را ذخیره می کند. ما می توانیم این کار را به این صورت انجام دهیم:
from collections import OrderedDict
import json
data = OrderedDict()
data('name') = 'John Doe'
data('age') = 30
data('city') = 'New York'
json_data = json.dumps(data, indent=4)
print(json_data)
و دریافت می کنیم:
{
"name": "John Doe",
"age": 30,
"city": "New York"
}
حال، فرض کنید میخواهیم آن را جابهجا کنیم name
ارزش تا پایان، ما می توانیم استفاده کنید move_to_end()
روش:
data.move_to_end('name')
json_data = json.dumps(data, indent=4)
print(json_data)
و دریافت می کنیم:
{
"age": 30,
"city": "New York",
"name": "John Doe"
}
حالا بیایید یک مثال را کمی پیچیده تر کنیم.
فرض کنید یک JSON ایجاد می کنیم که داده های بالا را برای چهار نفر مانند این گزارش می دهد:
from collections import OrderedDict
import json
people = OrderedDict()
people('person1') = OrderedDict()
people('person1')('name') = 'John Doe'
people('person1')('age') = 30
people('person1')('city') = 'New York'
people('person2') = OrderedDict()
people('person2')('name') = 'Jane Smith'
people('person2')('age') = 25
people('person2')('city') = 'London'
people('person3') = OrderedDict()
people('person3')('name') = 'Michael Johnson'
people('person3')('age') = 35
people('person3')('city') = 'Los Angeles'
people('person4') = OrderedDict()
people('person4')('name') = 'Emily Davis'
people('person4')('age') = 28
people('person4')('city') = 'Sydney'
json_data = json.dumps(people, indent=4)
print(json_data)
و دریافت می کنیم:
{
"person1": {
"name": "John Doe",
"age": 30,
"city": "New York"
},
"person2": {
"name": "Jane Smith",
"age": 25,
"city": "London"
},
"person3": {
"name": "Michael Johnson",
"age": 35,
"city": "Los Angeles"
},
"person4": {
"name": "Emily Davis",
"age": 28,
"city": "Sydney"
}
}
حالا مثلا اگر بخواهیم حرکت کنیم person1
تا آخر می توانیم از روش استفاده کنیم move_to_end()
:
people.move_to_end('person1')
json_data = json.dumps(people, indent=4)
print(json_data)
و دریافت می کنیم:
{
"person2": {
"name": "Jane Smith",
"age": 25,
"city": "London"
},
"person3": {
"name": "Michael Johnson",
"age": 35,
"city": "Los Angeles"
},
"person4": {
"name": "Emily Davis",
"age": 28,
"city": "Sydney"
},
"person1": {
"name": "John Doe",
"age": 30,
"city": "New York"
}
}
دقیقاً همانطور که می خواستیم.
نتیجه گیری
در این مقاله، ما دیدیم که چگونه می توانیم از آن استفاده کنیم OrderedDict
زیر کلاس برای ایجاد دیکشنری های مرتب.
ما همچنین در مورد چگونگی استفاده از آن بحث کرده ایم OrderedDict's
ویژگیهای منحصربهفرد: اینها بدون توجه به نسخه پایتونی که ما استفاده میکنیم، همچنان ویژگیهای مفیدی هستند. به طور خاص، از آنجایی که در پایتون ما اشیاء JSON را بسیار شبیه به دیکشنری ها ایجاد می کنیم، این یک مورد استفاده عملی است که در آن OrderedDict's
ویژگی های منحصر به فرد می تواند واقعا مفید باشد.
در پایان یک نکته کوچک. بحث هایی در جامعه توسعه دهندگان پایتون وجود دارد که پیشنهاد می کند به آن اعتماد نکنید روی اجرای جفت های کلید-مقدار مرتب شده از نسخه 3.7 به دلایل مختلف مانند:
- پایتون «نمیتواند بفهمد که آیا ما به آن تکیه میکنیم یا خیر روی این به این معنی است که برای مثال هیچ خطایی ایجاد نخواهد شد.
- ممکن است اشکالاتی وجود داشته باشد و ما متوجه آنها نشویم (یا می توانیم با هزینه های زیادی برای رفع اشکال متوجه آنها شویم).
- این پیاده سازی ممکن است در نسخه های آینده پایتون لغو شود.
- استفاده از
OrderedDict
به صراحت به برنامه نویسان دیگر می گوید که ما علاقه مندیم ترتیب جفت های کلید-مقدار را حفظ کنیم.
بنابراین، با در نظر گرفتن آنها، توصیه این است که از آن استفاده کنید OrderedDict
اگر میخواهیم مطمئن شویم نرمافزار ما حتی در آینده یکپارچگی دادهها را حفظ میکند، صرفنظر از نسخه پایتونی که از آن استفاده میکنیم، زیر کلاس را انتخاب کنیم.
(برچسبها به ترجمه)# python
منتشر شده در 1402-12-30 13:59:05