লুপগুলির জন্য একক লাইন নেস্টেড


102

অজগরটিতে এই ফাংশনটি লিখেছেন যা একটি ম্যাট্রিক্স স্থানান্তর করে:

def transpose(m):
    height = len(m)
    width = len(m[0])
    return [ [ m[i][j] for i in range(0, height) ] for j in range(0, width) ]

প্রক্রিয়াটিতে আমি বুঝতে পেরেছিলাম যে লুপগুলি কার্যকর করার জন্য একক লাইন কীভাবে নেস্ট করে I নিম্নলিখিত প্রশ্নের উত্তর দিয়ে আমাকে বুঝতে সাহায্য করুন:

  1. লুপের জন্য এটি কার্যকর করার আদেশটি কী?
  2. লুপের জন্য যদি আমার ট্রিপল নেস্ট থাকে তবে এটি কোন আদেশটি কার্যকর করবে?
  3. লুপের জন্য সমান অপরিবর্তিত সমানটি কী হবে?

দেওয়া,

[ function(i,j) for i,j in object ]
  1. লুপ কাঠামোর জন্য এটি ব্যবহার করতে কোন ধরণের অবজেক্ট থাকা উচিত?
  2. আমি এবং জে অবজেক্টের উপাদানগুলিকে অর্ডার করা হয় তা কী?
  3. এটি কি লুপ কাঠামোর জন্য আলাদা দ্বারা অনুকরণ করা যায়?
  4. এটি কি লুপের জন্য লুপের জন্য অনুরূপ বা ভিন্ন কাঠামোযুক্ত বাসা বাঁধতে পারে? এবং এটি দেখতে কেমন হবে?

অতিরিক্ত তথ্য পাশাপাশি প্রশংসা করা হয়।

উত্তর:


169

তথ্যের সর্বোত্তম উত্স হ'ল তালিকার বোধগম্য সম্পর্কিত সরকারী পাইথন টিউটোরিয়াল । তালিকার বোঝাপড়াগুলি লুপগুলির মতো প্রায় একই রকম (অবশ্যই কোনও তালিকা বোঝার জন্য একটি লুপ হিসাবে লেখা যেতে পারে) তবে তারা প্রায়শই লুপের জন্য ব্যবহারের চেয়ে দ্রুত হয়।

টিউটোরিয়াল থেকে এই দীর্ঘ তালিকা বোধগম্যতা দেখুন ( ifঅংশটি বোঝার ফিল্টার করে, কেবলমাত্র সেই অংশগুলি যা if স্টেটমেন্টটি তালিকা বোধের চূড়ান্ত অংশে (এখানে (x,y)) পাস করে :

>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

এটি লুপের জন্য নেস্ট করা ঠিক ঠিক একই (এবং টিউটোরিয়ালটি যেমন বলেছে, নোটটি কীভাবে এবং যদি একই হয় তবে নোট করুন)।

>>> combs = []
>>> for x in [1,2,3]:
...     for y in [3,1,4]:
...         if x != y:
...             combs.append((x, y))
...
>>> combs
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

তালিকা অনুধাবন এবং লুপের জন্য প্রধান পার্থক্যটি হ'ল লুপের চূড়ান্ত অংশটি (যেখানে আপনি কিছু করেন) শেষের পরিবর্তে শুরুতে আসে।

আপনার প্রশ্নে:

লুপ কাঠামোর জন্য এটি ব্যবহার করতে কোন ধরণের অবজেক্ট থাকা উচিত?

একটি পুনরাবৃত্ত । যে কোনও বস্তু উপাদানগুলির একটি (সসীম) সেট তৈরি করতে পারে। এর মধ্যে কোনও ধারক, তালিকা, সেট, জেনারেটর ইত্যাদি অন্তর্ভুক্ত রয়েছে

আমি এবং জে অবজেক্টের উপাদানগুলিকে অর্ডার করা হয় তা কী?

প্রতিটি তালিকা থেকে উত্পন্ন হওয়ার সাথে সাথে এগুলি ঠিক একই ক্রমে অর্পণ করা হয়, যেন তারা লুপের জন্য নেস্টেড ছিল (আপনার প্রথম বোঝার জন্য আপনি i এর জন্য 1 টি উপাদান পাবেন, তারপরে জে, দ্বিতীয় উপাদান থেকে আইতে প্রতিটি মান পাবেন, তারপরে জে ইত্যাদি থেকে প্রতিটি মান)

এটি কি লুপ কাঠামোর জন্য আলাদা দ্বারা অনুকরণ করা যায়?

হ্যাঁ, ইতিমধ্যে উপরে দেখানো হয়েছে।

এটি কি লুপের জন্য লুপের জন্য অনুরূপ বা ভিন্ন কাঠামোযুক্ত বাসা বাঁধতে পারে? এবং এটি দেখতে কেমন হবে?

অবশ্যই, তবে এটি দুর্দান্ত ধারণা নয়। উদাহরণস্বরূপ, এখানে আপনাকে অক্ষরের তালিকাগুলির একটি তালিকা দেয়:

[[ch for ch in word] for word in ("apple", "banana", "pear", "the", "hello")]

আমি আশ্চর্য হয়েছি যে ডাবল নেস্টিংয়ে তাদের অর্ডার দেওয়ার পছন্দকে কী নির্দেশিত করেছিল। আমি অন্য উপায়ে আরও প্রাকৃতিক দেখতে পাই (আপনার উদাহরণে x এর জন্য y)। আমি কেবল বুঝতে পেরেছি যে পাইথন করার 3 বছর পরে (ব্যাপকভাবে নয় তবে এখনও ...) এবং এই ধরণের লুপগুলি ব্যবহার করার জন্য !!
থমাস

@ থমাস আমি অন্যান্য উপায়টিকে আরও স্বজ্ঞাত বলে মনে করি। আমার বিশ্বাস পছন্দটি নিখুঁতভাবে সুবিধা ছিল। আরও স্বজ্ঞাত উপায়ে এটি করার অর্থ হ'ল সমাধান না হওয়া প্রতীকগুলি মোকাবেলা করা যতক্ষণ না এটি পরে বিবৃতিতে খুঁজে পায়। কাগজে প্রতিটি নগরীতে প্রতিটি শহর.বানানস্টোরের জন্য প্রতিটি কলাতে প্রতিটি কলা.পিলের জন্য পার্স করার চেষ্টা করুন। সহজ হিসাবে না। অন্যদিকে যদিও দুর্দান্ত এবং সহজ।
পাইজং

29

আপনার আগ্রহী হতে পারে itertools.product, যা আপনি এটি পাঠিয়েছেন এমন সমস্ত পুনরাবৃত্ত থেকে মানগুলির পুনরাবৃত্ত ফলনকারী টিপলগুলি প্রদান করে। এটি হ'ল itertools.product(A, B)ফর্মের সমস্ত মান দেয় (a, b), যেখানে aমানগুলি আসে Aএবং bমানগুলি আসে B। উদাহরণ স্বরূপ:

import itertools

A = [50, 60, 70]
B = [0.1, 0.2, 0.3, 0.4]

print [a + b for a, b in itertools.product(A, B)]

এই মুদ্রণ:

[50.1, 50.2, 50.3, 50.4, 60.1, 60.2, 60.3, 60.4, 70.1, 70.2, 70.3, 70.4]

লক্ষ্য করুন যে কীভাবে চূড়ান্ত যুক্তিটি itertools.product"অভ্যন্তরীণ" এ পাস হয়েছে । সাধারণত, সমানitertools.product(a0, a1, ... an)[(i0, i1, ... in) for in in an for in-1 in an-1 ... for i0 in a0]


4

প্রথমত, আপনার প্রথম কোডটি প্রতি সেটের লুপের জন্য ব্যবহার করে না, তবে একটি তালিকা বোধগম্য

  1. সমান হবে

    পরিসীমা জে জন্য (0, প্রস্থ): আমি পরিসীমা জন্য (0, উচ্চতা): মি [আমি] [জে]

  2. একইভাবে, এটি সাধারণত লুপগুলির জন্য ডান থেকে বামে বাসা বাঁধে। তবে তালিকা বোঝার বাক্য গঠন আরও জটিল।

  3. আমি নিশ্চিত না যে এই প্রশ্নটি কী জিজ্ঞাসা করছে


  1. যে কোনও পুনরাবৃত্ত বস্তু যা পুনরুক্তযোগ্য বস্তু দেয় যা হুবহু দুটি বস্তু দেয় (কী মুখর - [(1,2),'ab']যা বৈধ হবে)

  2. পুনরাবৃত্তির উপর অবজেক্টটি যে ক্রমে ফল দেয়। iপ্রথম ফলন যায়, jদ্বিতীয়।

  3. হ্যাঁ, তবে তেমন সুন্দর নয়। আমি বিশ্বাস করি এটি কার্যত সমান:

    l = তালিকা ()
    আই, জে অবজেক্টে:
        l.append (ফাংশন (ঝ, ঞ))
    

    অথবা আরও ভাল ব্যবহার মানচিত্র :

    map(function, object)

    তবে অবশ্যই ফাংশনটি পেতে হবে i, jনিজেই।

  4. এটি কি 3 এর মতো একই প্রশ্ন নয়?


2

zipফাংশন ব্যবহার করে আপনি একই লাইনে দুটি লুপের জন্য ব্যবহার করতে পারেন

কোড:

list1 = ['Abbas', 'Ali', 'Usman']
list2 = ['Kamran', 'Asgar', 'Hamza', 'Umer']
list3 = []
for i,j in zip(list1,list2):
    list3.append(i)
    list3.append(j)
print(list3)

আউটপুট:

['Abbas', 'Kamran', 'Ali', 'Asgar', 'Usman', 'Hamza']

সুতরাং, জিপ ফাংশন ব্যবহার করে আমরা দুটি লুপের জন্য ব্যবহার করতে পারি বা আমরা একই সারিতে দুটি তালিকা পুনরাবৃত্তি করতে পারি।


-1

নেস্টেড লুপগুলির জন্য সেরা উদাহরণগুলির জন্য কোডের নীচে, দুটি লুপের জন্য ব্যবহার করার সময় দয়া করে মনে রাখবেন প্রথম লুপের আউটপুটটি দ্বিতীয় লুপের জন্য ইনপুট। নেস্টেড লুপগুলি ব্যবহার করার সময় লুপ সমাপ্তিও গুরুত্বপূর্ণ

for x in range(1, 10, 1):
     for y in range(1,x):
             print y,
        print
OutPut :
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
1 2 3 4 5 6
1 2 3 4 5 6 7
1 2 3 4 5 6 7 8
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.