بگذارید واضح، ساده و صریح ابتدای همین مطلب بگوییم که منظورمان از لیستهای تودرتو چیست. به لیستهایی که داخل لیستهای دیگر قرار خواهند گرفت لیست تودرتو گفته میشود. لیستها در پایتون در واقع یک نوع از ساختارهای دادهای هستند که میتوانند هر نوع دادهای و ساختار دیگری را در خود ذخیره کنند از جمله خود لیست. خب هدف از این حالت چیست؟ در واقع ما زمانی از یک لیست تودرتو استفاده میکنیم که قصد ایجاد یک ساختار درختی یا سلسلهای از دادهها را داشته باشیم. البته استفاده کردن از سطحبندیهای مختلف هیچگونه محدودیتی ندارد. برای مثال شما میتواند صد لیست متفاوت را در درون یک دیگر قرار دهید اما بهتر است که در ساختار پروژهتان محدودیتهایی را اعمال کرده و بیشتر از ۳ لیست را در این حالت استفاده نکنید. این کار بمنظور افزایش خوانایی کدها بسیار ضروری و مهم است.
همانطور که میدانید برای دسترسی پیدا کردن به یک المان از لیست ما باید شماره ایندکس آن را که از صفر شروع میشود فراخوانی کنیم. اما زمانی که بخواهیم به المانهای یک لیست تودرتو دسترسی داشته باشیم در این حالت حالت ایندکس نوشتن کمی متفاوت خواهد بود. برای مثال به لیست تودرتو زیر دقت کنید:
B = [
[2,5,4],
[3,5,7],
[4,7,8] ]
print( B[0][0], B[0][1], B[0][2] )
همانطور که مشاهده میکنید ما یک لیست به نام B در اختیار داریم که سه لیست دیگر در آن قرار گرفته است. برای خروجی گرفتن از اولین مقدار در اولین لیست داخلی، باید دو شماره ایندکس را وارد کنیم. اولین مورد شماره ایندکس لیست اصلی و دومین ایندکس مربوط به عضو لیست انتخابی.
در خروجی دستور Print ما میتوانیم هر سه المان لیست اول (ایندکس صفر) را مشاهده کنیم.
قابلیت تغییر
از آنجایی که لیستها در پایتون قابلیت تغییرپذیری را دارند در نتیجه در لیستهای تودرتو نیز ما میتوانیم با دسترسی به یک داده آن را تغییر دهیم. به مثال زیر توجه کنید:
B[0][0] = 9
B[0][1] = 'a'
print( B[0][0], B[0][1], B[0][2] )
استفاده از حلقه
یکی از مهمترین ویژگیهای لیستها در پایتون قابلیت iterate یا بازگو کردنشان است. به این معنا که ما با استفاده از یک حلقه ساده المانهای آن را کاوش کنیم. در حالت عادی ما برای iterate کردن روی یک لیست ساده به صورت زیر عمل میکردیم:
b = [1,2,3,4,5,6]
for i in b:
print(i)
اما حال که ما لیست تودرتو داریم نیاز است که به میزان درخت یا سطحبندی که آرایهمان دارد حلقه for داشته باشیم. برای مثال اگر لیست ما دو سطحی باشد مانند مثالهای قبل باید دو حلقه یکی برای پیمایش ایندکسهای اصلی و یکی برای پیمایش ایندکسهای هر آرایه جداگانه تعریف کنیم. به مثال زیر توجه کنید:
b = [
['a','b','c'],
[1,2,3],
[True, False, None]
]
for i in b:
for j in range(3):
print(i[j])
اما در این قطعه کد یک مشکل وجود دارد و آن این است که اگر لیستهای تودرتو من از تعداد اعضای نامساوی تشکیل شود چه کاری باید انجام دهم؟ برای مثال همان قطعه کد بالا برای لیست زیر نمیتواند جوابگو باشد.
b = [
['a','b','c'],
[1,2,3,4,5,6],
[True, False, None]
]
در این حالت من باید هر عضو از لیستهای تودرتو که در حلقه دوم با استفاده از متغیر j به آنها دست پیدا کردهام را انتخاب کنم اما range مربوط به j چقدر باید باشد؟ پاسخ صحیح این است که j باید به اندازه هر کدام از لیستهای تودرتو پیش برود و این مقدار متناوبا تغییر پیدا میکند. برای همین من باید محدوده هر لیست را به صورت خودکار بدست بیاورم. برای این کار نیز تنها کافیست تا به صورت زیر عمل کنم.
for i in b:
for j in range(len(i[:])):
print(i[j])
دیدگاه و پرسش
در حال دریافت نظرات از سرور، لطفا منتظر بمانید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید