এক-লাইন তালিকা অনুধাবন: যদি-অন্য রূপগুলি ian


178

এটি পাইথন তালিকা বোঝার বাক্য গঠন সম্পর্কে আরও। আমি একটি তালিকা উপলব্ধি পেয়েছি যা প্রদত্ত ব্যাপ্তির বিজোড় সংখ্যার তালিকা তৈরি করে:

[x for x in range(1, 10) if x % 2]

এটি একটি ফিল্টার তৈরি করে - আমি একটি উত্স তালিকা পেয়েছি, যেখানে আমি এমনকি সংখ্যার ( if x % 2) নাম্বার সরিয়েছি । আমি এখানে-পরে-অন্যরকম কিছু ব্যবহার করতে চাই। নিম্নলিখিত কোড ব্যর্থ:

>>> [x for x in range(1, 10) if x % 2 else x * 100]
  File "<stdin>", line 1
    [x for x in range(1, 10) if x % 2 else x * 100]
                                         ^
SyntaxError: invalid syntax

অজগর মত প্রকাশ আছে যেমন - অন্যথায়:

1 if 0 is 0 else 3

কীভাবে এটি কোনও তালিকা বোধের ভিতরে ব্যবহার করবেন?


1
এর মূল্য কী তা কম, আপনার একটি জেনারেটর নয়, একটি "তালিকা উপলব্ধি" রয়েছে। জেনারেটরের ()পরিবর্তে ব্যবহার ব্যতীত চূড়ান্ত বাক্য গঠন একই []
মিগিলসন


2
এমনকি এমনকি সংখ্যার (তাদের রাখার পরিবর্তে) if x % 2 বাদ দেয় কেন তা পেতে আমার কিছুটা সময় লেগেছিল - এটি কারণ কারণটি xএমনকি যখন x % 2প্রকাশের ফলাফল হয় 0, যা ঘুরে ফিরে মূল্যায়ণ করে False, অন্যদিকে মূল্যায়ন intব্যতীত অন্য 0কোনওটিই True

উত্তর:


328

x if y else zআপনি প্রতিটি উপাদানটির জন্য ফিরে আসছেন এমন ভাবের বাক্য গঠন বাক্য। সুতরাং আপনার প্রয়োজন:

[ x if x%2 else x*100 for x in range(1, 10) ]

আপনি প্রথম উদাহরণে একটি ফিল্টার ব্যবহার করছেন তবে দ্বিতীয়টিতে নয়, এই বিভ্রান্তির সৃষ্টি হয়েছিল । দ্বিতীয় উদাহরণে আপনি কেবল তিনটি অপারেটর এক্সপ্রেশন ব্যবহার করে প্রতিটি মানকে অন্যটিতে ম্যাপিং করছেন ।

একটি ফিল্টার সহ, আপনার প্রয়োজন:

[ EXP for x in seq if COND ]

ফিল্টার ছাড়া আপনার প্রয়োজন:

[ EXP for x in seq ]

এবং আপনার দ্বিতীয় উদাহরণে, অভিব্যক্তিটি একটি "জটিল", যা এর সাথে জড়িত if-else


2
আমি একটি প্রশ্ন পেয়েছি ... [x for x in range(1, 10) if x % 2]সঠিক বাক্য গঠন। [x if x % 2 for x in range(1, 10)]- এটি না, তবে [x if x%2 else x*100 for x in range(1, 10)]আবার, সঠিক বাক্য গঠন। কিভাবে?
ডুচিন

@tkoomzaaskz আপনার দ্বিতীয় উদাহরণে, এটি না কোনও তিনটি-যদি-অন্য কোনও অপারেটর (অনুপস্থিত else), বা একটি ফিল্টার (যেহেতু এটি EXPতালিকা বোঝার অংশ হিসাবে রয়েছে)
shx2

3
@tkoomzaaskz আরও স্পষ্ট করার জন্য, নোট করুন যে আপনি ifশেষে একটি দ্বিতীয় যুক্ত করতে পারেন : [x if x%2 else x*100 for x in range(1, 10) if not x%3]প্রথমটি ifটার্নারি অপারেটরের ifঅংশ, দ্বিতীয়টি তালিকা বোধগম্য বাক্য গঠনটির অংশ। পুরো x if x%2 else x*100একটি সহজ হিসাবে "একই স্তরের এ" 2*x, এটা বামদিকে নির্ণয় করা অভিব্যক্তি forযখন ফিল্টারিং, if not x%3ইতিমধ্যে সঞ্চালিত হয়েছে।
zx81

হ্যালো, একটি লাইন বিবৃতিটি দুটি লাইনে তৈরি করার চেয়ে for i in x:লুপের জন্য আরও পারফরম্যান্স হতে পারে if i == y:?
অ্যালেক্সিস.রোল্যান্ড


12

আপনি তালিকা বোধগম্যতার সাথে এটি করতে পারেন:

A=[[x*100, x][x % 2 != 0] for x in range(1,11)]
print A

1
খুব সুন্দর. একটি বুলিয়ান টুকরা। ধন্যবাদ আপনি সবেমাত্র আমাকে সমাধান পড়ার সহজতর সুযোগ দিয়েছিলেন।

আপনি এর মতো দ্বিগুণ নিয়োগও করতে পারেন: এ, বি = [10,11] [a == 19], [1,14] [a == 20]
স্টিফান গ্রুয়েনওয়াল্ড

10

আরও একটি সমাধান, আশা করি কেউ এটি পছন্দ করতে পারে:

ব্যবহার: [মিথ্যা, সত্য] [অভিব্যক্তি]

>>> map(lambda x: [x*100, x][x % 2 != 0], range(1,10))
[1, 200, 3, 400, 5, 600, 7, 800, 9]
>>>

3

আমি এটি করতে সক্ষম হয়েছিল

>>> [x if x % 2 != 0 else x * 100 for x in range(1,10)]
    [1, 200, 3, 400, 5, 600, 7, 800, 9]
>>>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.