এটি একটি চালাক বিট।
প্রথমত, একটি মন্তব্যে উল্লিখিত হিসাবে, পাইথন 3 এ zip()একজন পুনরুক্তি প্রদানকারী ফেরত দেয়, সুতরাং আপনাকে list()আসল তালিকাটি ফিরে পেতে পুরো জিনিসটি ঘিরে ফেলতে হবে, সুতরাং ২০২০ সালের মধ্যে এটি আসলে:
list(zip(*original[::-1]))
এখানে ভাঙ্গন:
[::-1]- বিপরীত ক্রমে মূল তালিকার অগভীর অনুলিপি তৈরি করে। reversed()তালিকাকে প্রকৃতপক্ষে অনুলিপি না করে (আরও মেমরি দক্ষ) তুলনায় বিপরীত পুনরায় উত্পাদনকারী ব্যবহার করতে পারে।
*- মূল তালিকার প্রতিটি সাবলিস্টকে পৃথক যুক্তিযুক্ত করে তোলে zip()(অর্থাত্ তালিকাকে আনপ্যাক করে)
zip()- প্রতিটি তর্ক থেকে একটি আইটেম নেয় এবং সেগুলি থেকে একটি তালিকা তৈরি করে (ভাল, একটি টিপল), এবং সমস্ত সাবলিস্টগুলি শেষ না হওয়া পর্যন্ত পুনরাবৃত্তি করে। এই স্থানান্তর আসলে ঘটে।
list()আউটপুটকে zip()তালিকায় রূপান্তর করে ।
সুতরাং ধরে নিলাম আপনার কাছে এটি রয়েছে:
[ [1, 2, 3],
[4, 5, 6],
[7, 8, 9] ]
আপনি প্রথমে এটি পাবেন (অগভীর, বিপরীত অনুলিপিটি):
[ [7, 8, 9],
[4, 5, 6],
[1, 2, 3] ]
পরবর্তী প্রতিটি সাবলিস্টকে এখানে যুক্তি হিসাবে পাস করা হয় zip:
zip([7, 8, 9], [4, 5, 6], [1, 2, 3])
zip() এর প্রতিটি আর্গুমেন্টের শুরু থেকে বারবার একটি আইটেম গ্রাস করে এবং এর থেকে আরও একটি আইটেম তৈরি করে, যতক্ষণ না কোনও আইটেম না থাকে, ফলস্বরূপ (এটি একটি তালিকায় রূপান্তরিত হওয়ার পরে):
[(7, 4, 1),
(8, 5, 2),
(9, 6, 3)]
এবং বব আপনার মামা।
একে অন্য দিকে ঘোরানো সম্পর্কে একটি মন্তব্যে @ আইকেমিগুয়েলের প্রশ্নের উত্তর দেওয়ার জন্য, এটি বেশ সোজা: আপনার কেবলমাত্র ক্রম zipএবং ফলাফল উভয়ই বিপরীত করতে হবে । প্রথমটিকে অপসারণের মাধ্যমে প্রথমটি অর্জন করা যায় [::-1]এবং দ্বিতীয়টি reversed()পুরো জিনিসটির চারপাশে ছুঁড়ে ফেলে অর্জন করা যায় । যেহেতু reversed()আয় তালিকা ধরে কোনো ইটারেটরে, আমরা করা প্রয়োজন হবে list()প্রায় যে এটা রূপান্তর করবে। list()পুনরাবৃত্তিকে একটি আসল তালিকায় রূপান্তর করতে বেশ কয়েকটি অতিরিক্ত কল সহ । তাই:
rotated = list(reversed(list(zip(*original))))
আমরা "মার্টিয়ান স্মাইলি" স্লাইস না করে কিছুটা সহজ করতে reversed()পারি ... তারপরে আমাদের বাইরের দরকার নেই list():
rotated = list(zip(*original))[::-1]
অবশ্যই, আপনি কেবল তালিকাটি ঘড়ির কাঁটার দিকে তিনবার ঘোরান। :-)