তালিকা সংকোচনে দ্বৈত Iteration


226

পাইথনে আপনার তালিকাগুলির মতো একাধিক পুনরাবৃত্তি থাকতে পারে

[(x,y) for x in a for y in b]

কিছু উপযুক্ত সিকোয়েন্সের জন্য ক এবং খ। আমি পাইথনের তালিকা বোঝার নেস্টেড লুপ শব্দার্থবিজ্ঞান সম্পর্কে সচেতন।

আমার প্রশ্ন: বোধগম্যতার মধ্যে একটি পুনরাবৃত্তি অন্যজনকে বোঝাতে পারে? অন্য কথায়: আমি কি এরকম কিছু পেতে পারি:

[x for x in a for a in b]

বাইরের লুপের বর্তমান মানটি কোথায় অভ্যন্তরের পুনরুক্তি?

উদাহরণ হিসাবে, যদি আমার নেস্টেড তালিকা থাকে:

a=[[1,2],[3,4]]

এই ফলাফলটি অর্জনের জন্য তালিকা বোধগম্য প্রকাশটি কী হবে:

[1,2,3,4]

?? (দয়া করে কেবলমাত্র বোধগমতার উত্তরগুলি তালিকা করুন, যেহেতু এটি আমি জানতে চাই))

উত্তর:


178

আপনার নিজের পরামর্শ দিয়ে আপনার প্রশ্নের উত্তর দিতে:

>>> [x for b in a for x in b] # Works fine

আপনি তালিকা বোধগম্য উত্তরগুলির জন্য জিজ্ঞাসা করার সময়, আমাকে দুর্দান্ত itertools.chain ():

>>> from itertools import chain
>>> list(chain.from_iterable(a))
>>> list(chain(*a)) # If you're using python < 2.6

10
[x for b in a for x in b]এটি অজগর সম্পর্কে সর্বদা বগড। এই বাক্য গঠনটি এত পিছনের দিকে। x for x in yসর্বদা সাধারণ ফর্মটির জন্য সরাসরি চলক থাকে, for এর বাম দিকে অভিব্যক্তি ফিড করে। আপনি দ্বিগুণ বোঝাপড়া করার সাথে সাথে আপনার অতি সম্প্রতি পুনরাবৃত্ত পরিবর্তনশীল হঠাৎ এতদূর "দূরে" is এটি বিশ্রী, এবং প্রাকৃতিকভাবে মোটেও পড়েন না
ক্রুঙ্কার

169

আমি আশা করি যে এটি অন্য কাউকে সাহায্য করবে যেহেতু a,b,x,yআমার কাছে এর বেশি অর্থ নেই! ধরুন আপনার কাছে বাক্যে পূর্ণ পাঠ্য রয়েছে এবং আপনি শব্দের একটি অ্যারে চান।

# Without list comprehension
list_of_words = []
for sentence in text:
    for word in sentence:
       list_of_words.append(word)
return list_of_words

আমি তালিকার অনুভূতিকে অনুভূমিকভাবে প্রসারিত কোড হিসাবে ভাবতে চাই।

এটিকে ভেঙে ফেলার চেষ্টা করুন:

# List Comprehension 
[word for sentence in text for word in sentence]

উদাহরণ:

>>> text = (("Hi", "Steve!"), ("What's", "up?"))
>>> [word for sentence in text for word in sentence]
['Hi', 'Steve!', "What's", 'up?']

এটি জেনারেটরের জন্যও কাজ করে

>>> text = (("Hi", "Steve!"), ("What's", "up?"))
>>> gen = (word for sentence in text for word in sentence)
>>> for word in gen: print(word)
Hi
Steve!
What's
up?

8
"কম্পিউটার বিজ্ঞানে দুটি মাত্র সমস্যা রয়েছে: ক্যাশে অবৈধকরণ এবং নামকরণের জিনিস" " - ফিল Karlton
cezar

এটি পুরো সমস্যাটিকে কম বিমূর্ত করে তোলে বলে এটি দুর্দান্ত উত্তর! ধন্যবাদ!
এ 13:

আমি ভাবছিলাম, আপনি কি তালিকার বোঝার তিনটি বিমূর্ত স্তর সহ একই করতে পারেন? পাঠ্য অধ্যায়গুলির মতো, অধ্যায়গুলিতে বাক্য এবং বাক্যে শব্দগুলি?
ক্যাপ্টেন ফোগেটি

123

জিৎ, আমি অনুমান করেছি যে আমি এ্যানসারটি পেয়েছি: কোন লুপটি অভ্যন্তরীণ এবং কোনটি বাহ্যিক সে বিষয়ে আমি যথেষ্ট যত্ন নিচ্ছিলাম না। তালিকাটি বোঝার মতো হওয়া উচিত:

[x for b in a for x in b]

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


67
লিস্ট বোধগম্য সিনট্যাক্স পাইথনের জ্বলন্ত পয়েন্টগুলির মধ্যে একটি নয়।
গ্লেন মেইনার্ড

2
@ গ্লেন হ্যাঁ, এটি সহজেই প্রকাশের চেয়ে বেশি অভিব্যক্তির জন্য সংশ্লেষিত হয়।
টমাসএইচ

1
ইডব্ল্যু। আমি নিশ্চিত না যে এটি তালিকা বোধের জন্য "সাধারণ" ব্যবহার, তবে এটি খুব দুর্ভাগ্যজনক যে পাইথনটিতে শৃঙ্খলাবদ্ধতা এতই বাজে।
ম্যাট জেন্ডার

14
আপনি প্রতিটি 'জন্য' এর আগে নিউলাইনগুলি রাখলে এটি খুব পরিষ্কার দেখাচ্ছে।
নিক গারভে

16
বাহ, এটি আমার মাথায় যা বোঝায় তা সম্পূর্ণ বিপরীত।
obskyr

51

পুনরাবৃত্তির ক্রমটি স্ব-স্বজ্ঞাত বলে মনে হতে পারে।

উদাহরণস্বরূপ নিন: [str(x) for i in range(3) for x in foo(i)]

এর পচা যাক:

def foo(i):
    return i, i + 0.5

[str(x)
    for i in range(3)
        for x in foo(i)
]

# is same as
for i in range(3):
    for x in foo(i):
        yield str(x)

4
কী চোখ খোলা !!
নেহেম

আমার বোধগম্যতা এর কারণ হ'ল "তালিকাভুক্ত প্রথম পুনরাবৃত্তি হ'ল শীর্ষতম পুনরাবৃত্তি যা টাইপ করা হত যদি বোঝার বিষয়টি লুপের জন্য নেস্টেড হিসাবে লেখা হত"। এর বিপরীত কারণটি হ'ল বন্ধ আউট লুপ (শীর্ষে যদি নেস্টের জন্য নেস্ট করা থাকে) বন্ধনী তালিকা / ডিকের (বোধগম্য বস্তু) এর ভিতরে উপস্থিত থাকে। বিপরীতভাবে, আভ্যন্তরীণ লুপটি (অন্তঃপুরে যখন নেস্টের জন্য নেস্টেড হিসাবে লেখা হয়) কোনও বোধগম্যের মধ্যে সঠিকভাবে ডানদিকের লুপ হয় এবং সেইভাবে বোঝার বাহ্যিক স্থানে উপস্থিত হয়।
জাচ সিগেল

Abstractly লিখিত আছে [(output in loop 2) (loop 1) (loop 2)]সঙ্গে (loop 1) = for i in range(3)এবং (loop 2) = for x in foo(i):এবং (output in loop 2) = str(x)
Qaswed

20

থমাসএইচ ইতিমধ্যে একটি ভাল উত্তর যুক্ত করেছে, তবে আমি কী হতে হবে তা দেখাতে চাই:

>>> a = [[1, 2], [3, 4]]
>>> [x for x in b for b in a]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'b' is not defined

>>> [x for b in a for x in b]
[1, 2, 3, 4]
>>> [x for x in b for b in a]
[3, 3, 4, 4]

আমার ধারণা পাইথন বাম থেকে ডানে তালিকার উপলব্ধিকে পার্স করে ars এর অর্থ, প্রথমটিfor লুপটি ঘটে প্রথমে কার্যকর করা হবে।

এর দ্বিতীয় "সমস্যা" হ'ল bতালিকার বোধগম্যতার বাইরে "ফাঁস" হয়ে যায়। প্রথম সফল তালিকা বোঝার পরে b == [3, 4]


3
আকর্ষণীয় বিষয়। আমি এতে অবাক হয়েছি:x = 'hello'; [x for x in xrange(1,5)]; print x # x is now 4
'11 এ গিরিচ করুন


10

আপনি যদি বহু মাত্রিক অ্যারে রাখতে চান তবে একটির অ্যারে বন্ধনীগুলি বাসাতে হবে। নীচে উদাহরণ দেখুন যেখানে প্রতিটি উপাদানগুলিতে একটি যুক্ত করা হয়েছে।

>>> a = [[1, 2], [3, 4]]

>>> [[col +1 for col in row] for row in a]
[[2, 3], [4, 5]]

>>> [col +1 for row in a for col in row]
[2, 3, 4, 5]

8

এই মেমরি টেকনিক আমাকে অনেক সাহায্য করে:

[ <RETURNED_VALUE> <OUTER_LOOP1> <INNER_LOOP2> <INNER_LOOP3> ... <OPTIONAL_IF> ]

এবং এখন আপনি মনে করতে পারেন আর eturn + + হে শুধুমাত্র uter-লুপ আর ight হে rder

উপরে জানার পরেও 3 টি লুপের জন্য বিস্তৃত তালিকার ক্রমটি সহজ বলে মনে হচ্ছে:


c=[111, 222, 333]
b=[11, 22, 33]
a=[1, 2, 3]

print(
  [
    (i, j, k)                            # <RETURNED_VALUE> 
    for i in a for j in b for k in c     # in order: loop1, loop2, loop3
    if i < 2 and j < 20 and k < 200      # <OPTIONAL_IF>
  ]
)
[(1, 11, 111)]

কারণ উপরেরটি কেবল একটি:

for i in a:                         # outer loop1 GOES SECOND
  for j in b:                       # inner loop2 GOES THIRD
    for k in c:                     # inner loop3 GOES FOURTH
      if i < 2 and j < 20 and k < 200:
        print((i, j, k))            # returned value GOES FIRST

একটি নেস্টেড তালিকা / কাঠামো পুনরাবৃত্তি করার জন্য, টেকনিক একই: aপ্রশ্ন থেকে:

a = [[1,2],[3,4]]
[i2    for i1 in a      for i2 in i1]
which return [1, 2, 3, 4]

একে অপরের নেস্টেড স্তরের জন্য

a = [[[1, 2], [3, 4]], [[5, 6], [7, 8, 9]], [[10]]]
[i3    for i1 in a      for i2 in i1     for i3 in i2]
which return [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

ইত্যাদি


ধন্যবাদ, তবে আপনি যা বর্ণনা করছেন তা হ'ল জড়িত পুনরাবৃত্তিকারীরা স্বতন্ত্র case প্রকৃতপক্ষে, আপনার উদাহরণে আপনি যে কোনও ক্রমে পুনরাবৃত্তিকে ব্যবহার করতে পারেন এবং একই ফলাফলের তালিকা (মডুলোর ক্রম) পেয়েছিলেন । যে ক্ষেত্রে আমি বেশি আগ্রহী সেগুলি নেস্টেড তালিকাগুলির সাথে ছিল যেখানে একটি পুনরুক্তি করা হবে পরবর্তীটির পুনরাবৃত্তিযোগ্য।
টমাসএইচ

@ থমাসএইচ: গা bold়ে সংজ্ঞায়িত লুপের ক্রমটি আপনার প্রয়োজনের জন্য ঠিক। নীচে আপনার ডেটা কভার করার জন্য একটি উদাহরণ এবং অতিরিক্ত নেস্টেড স্তরের সাথে আরও একটি উদাহরণ যুক্ত করা হয়েছে।
সাওওমির লেনার্ট


3

অতিরিক্তভাবে, আপনি বর্তমানে প্রবেশ করা ইনপুট তালিকার সদস্য এবং এই সদস্যের অভ্যন্তরের উপাদানটির জন্য কেবল একই চলকটি ব্যবহার করতে পারেন । তবে এটি এটিকে আরও (তালিকা) বোধগম্য করে তুলতে পারে।

input = [[1, 2], [3, 4]]
[x for x in input for x in x]

প্রথমে for x in inputমূল্যায়ন করা হয়, যার ফলে ইনপুটটির এক সদস্যের তালিকা তৈরি হয়, তারপরে পাইথন দ্বিতীয় অংশটি দিয়ে for x in xযায়, যার সময় এক্স-ভ্যালু বর্তমান উপাদানটি অ্যাক্সেস করে তা ওভাররাইট করা হয়, তারপরে প্রথমটি xনির্ধারণ করে যে আমরা কী ফিরে আসতে চাই।


1

এই ফ্ল্যাটেন_নেভেল ফাংশনটি পুনরাবৃত্তভাবে নেস্টেড তালিকা 1 কে এক স্তরে গোপন করতে কল করে। এটি চেষ্টা করে দেখুন

def flatten_nlevel(list1, flat_list):
    for sublist in list1:
        if isinstance(sublist, type(list)):        
            flatten_nlevel(sublist, flat_list)
        else:
            flat_list.append(sublist)

list1 = [1,[1,[2,3,[4,6]],4],5]

items = []
flatten_nlevel(list1,items)
print(items)

আউটপুট:

[1, 1, 2, 3, 4, 6, 4, 5]

1
ঠিক আছে, প্রশ্নটি বিশেষত তালিকা বোঝার বিষয়ে ছিল, এবং তালিকা সমতলকরণের একটি উদাহরণ ছিল was তবে আমি ধরে নিই, আপনার সাধারণীকরণের তালিকা ফ্ল্যাটনারকে নিজেকে পুনরাবৃত্তভাবে কল করতে হবে। তাই সম্ভবত এটি আরও বেশি পছন্দ flatten_nlevel(sublist, flat_list), তাই না ?!
টমাসএইচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.