যদি / অন্য একটি তালিকা বোধগম্য


900

পাইথনে আমি কীভাবে নিম্নলিখিতগুলি করতে পারি?

row = [unicode(x.strip()) for x in row if x is not None else '']

মূলত:

  1. খালি স্ট্রিং সহ সমস্ত নোন প্রতিস্থাপন করুন এবং তারপরে
  2. একটি ফাংশন সম্পাদন

উত্তর:


1453

আপনি সম্পূর্ণরূপে এটি করতে পারেন। এটি কেবল একটি অর্ডারিং ইস্যু:

[unicode(x.strip()) if x is not None else '' for x in row]

সাধারণভাবে,

[f(x) if condition else g(x) for x in sequence]

এবং ifশুধুমাত্র শর্তাদি সহ তালিকাগুলি বোঝার জন্য ,

[f(x) for x in sequence if condition]

নোট যে এটি আসলে একটি ভিন্ন ভাষা কনস্ট্রাক্ট, একটি ব্যবহার শর্তাধীন অভিব্যক্তি , যা নিজেই অংশ নয় ধী সিনট্যাক্স , যখন ifপরে for…inতালিকা comprehensions অংশ এবং ব্যবহার করা ফিল্টার উৎস iterable থেকে উপাদানগুলি।


শর্তসাপেক্ষ এক্সপ্রেশনগুলি সমস্ত ধরণের পরিস্থিতিতে ব্যবহার করা যেতে পারে যেখানে আপনি কিছু শর্তের উপর ভিত্তি করে দুটি অভিব্যক্তি মানগুলির মধ্যে চয়ন করতে চান। এটি অন্যান্য ভাষায় বিদ্যমান টের্নারি অপারেটরের?: মতোই কাজ করে । উদাহরণ স্বরূপ:

value = 123
print(value, 'is', 'even' if value % 2 == 0 else 'odd')

141
মনে রাখবেন যে যদি / অন্যটি এখানে এখন "টেরিনারি অপারেটর" সিনট্যাক্স এবং বোধগম্যতা সিনট্যাক্স তালিকাভুক্ত নয়।
অ্যাডাম ভ্যান্ডেনবার্গ

8
এজন্য আমি টেরিনারি অপারেটরটিকে বন্ধনীতে রাখতে পছন্দ করি, এটি এটি পরিষ্কার করে দেয় যে এটি কেবল একটি সাধারণ ভাব, বোঝা নয়।
জোচেন রিটজেল

17
সুতরাং কৌশলটি হ'ল "তালিকা সংক্ষেপে আমি লিখি যদি এর আগে আমাকে অন্য অংশটিও যোগ করতে হয়"। কারণ যদি আমার l = [ 2, 3, 4, 5]তারপর [x if x % 2 == 0 for x in l]আমাকে যেহেতু ত্রুটি দিতে [x if x % 2 == 0 else 200 for x in l]কাজ করে। হ্যাঁ আমি এটি ফিল্টার করতে জানি আমার লেখা উচিত [ x for x in l if x % 2 == 0]। বিরক্তির জন্য দুঃখিত। আপনার উত্তরের জন্য ধন্যবাদ.
গ্রিজেশ চৌহান

5
পাইথন ডক্স তিন অপারেটর উল্লেখ । নোট করুন এটির অন্যটি প্রয়োজন, বা এটি কাজ করে না।
nnot101

4
@ দ্রুদ্দিন তালিকা অনুধাবনগুলি তার পুনরাবৃত্তির সময় ভাঙ্গা সমর্থন করে না। আপনাকে তখন একটি সাধারণ লুপ ব্যবহার করতে হবে।
অকর্মা

44

একমুখী:

def change(f):
    if f is None:
        return unicode(f.strip())
    else:
        return ''

row = [change(x) for x in row]

যদিও তখন আপনার কাছে রয়েছে:

row = map(change, row)

অথবা আপনি লাম্বদা ইনলাইন ব্যবহার করতে পারেন।


13
আপনি যখন ifএর বা elseস্টেটমেন্ট ব্লকের এক্সপ্রেশন বা কোড থেকে সম্ভাব্য ব্যতিক্রমগুলি পরিচালনা করতে পারেন তখন এটি ব্যবহারের জন্য একটি ভাল (সম্ভবত কেবল) কৌশল । গৃহীত উত্তর সহজ ক্ষেত্রে ভাল।
মার্টিনিউ

37

এখানে আরও একটি উদাহরণস্বরূপ উদাহরণ রয়েছে:

>>> print(", ".join(["ha" if i else "Ha" for i in range(3)]) + "!")
Ha, ha, ha!

এটা সত্য যে শোষণ if iমূল্যায়ণ Falseজন্য 0এবং Trueসমস্ত অন্যান্য মানের জন্য ফাংশন দ্বারা উত্পন্ন range()। অতএব তালিকাটি বোধগম্যতা নীচে হিসাবে মূল্যায়ন করে:

>>> ["ha" if i else "Ha" for i in range(3)]
['Ha', 'ha', 'ha']

37

সুনির্দিষ্ট সমস্যাটি ইতিমধ্যে পূর্ববর্তী উত্তরগুলিতে সমাধান করা হয়েছে, সুতরাং আমি তালিকা বোধগম্যতার মধ্যে শর্তসাপেক্ষ ব্যবহার করার সাধারণ ধারণাটি সম্বোধন করব।

এখানে একটি উদাহরণ যা দেখায় যে কীভাবে শর্তসাপেক্ষে একটি তালিকা বোঝার ভিতরে রচনা করা যেতে পারে:

X = [1.5, 2.3, 4.4, 5.4, 'n', 1.5, 5.1, 'a']     # Original list

# Extract non-strings from X to new list
X_non_str = [el for el in X if not isinstance(el, str)]  # When using only 'if', put 'for' in the beginning

# Change all strings in X to 'b', preserve everything else as is
X_str_changed = ['b' if isinstance(el, str) else el for el in X]  # When using 'if' and 'else', put 'for' in the end

মনে রাখবেন যে প্রথম তালিকার জন্য বোধগম্যতার জন্য X_non_str, ক্রমটি হল:

অভিব্যক্তি জন্য আইটেমটি মধ্যে iterable যদি শর্ত

এবং সর্বশেষ তালিকা বোধগম্যতার জন্য X_str_changed, ক্রমটি হল:

expression1 যদি শর্ত আর expression2 জন্য আইটেমটি মধ্যে iterable

আমি সবসময় এটা কঠিন মনে রেখ খুঁজতে expresseion1 সামনে হতে হয়েছে যদি এবং expression2 পর হতে হয়েছে অন্য । আমার মাথা চায় উভয়ই আগে হোক বা পরে হোক।

আমার ধারণা এটি এ জাতীয়ভাবে তৈরি করা হয়েছে কারণ এটি সাধারণ ভাষার অনুরূপ, যেমন " বৃষ্টি হলে আমি ভিতরে থাকতে চাই , অন্যথায় আমি বাইরে যেতে চাই"

সরল ইংরেজিতে উপরে উল্লিখিত দুটি ধরণের তালিকার বোঝাপত্র হিসাবে বর্ণিত হতে পারে:

শুধুমাত্র সহ if:

extract_apple জন্য আপেল মধ্যে box_of_apples যদি apple_is_ripe

এবং সাথে if/else

mark_apple যদি apple_is_ripe অন্য leave_it_unmarked জন্য আপেল মধ্যে box_of_apples


7

অন্য সমাধানগুলি একক if/ elseনির্মাণের জন্য দুর্দান্ত । তবে তালিকা বোধগম্যতার মধ্যে ত্রৈমাসিক বিবৃতিগুলি পড়া তর্কযোগ্যভাবে কঠিন।

একটি ফাংশন ব্যবহারযোগ্যতা পঠনযোগ্যতা ব্যবহার করে, তবে ম্যাপিং একটি ইনপুট যেখানে ওয়ার্কফ্লোতে এ জাতীয় সমাধান প্রসারিত বা অভিযোজিত করা কঠিন। একটি অভিধান এই উদ্বেগগুলি দূর করতে পারে:

row = [None, 'This', 'is', 'a', 'filler', 'test', 'string', None]

d = {None: '', 'filler': 'manipulated'}

res = [d.get(x, x) for x in row]

print(res)

['', 'This', 'is', 'a', 'manipulated', 'test', 'string', '']

1

এটি কীভাবে তালিকা বোধগম্যতা সম্পাদন করে তা করতে হবে।

নিম্নলিখিত বিষয়গুলি মনে রাখবেন:

[ expression for item in list if conditional ]

এর সমতুল্য:

for item in list:
    if conditional:
        expression

যেখানে expressionসামান্য আলাদা ফর্ম্যাটে রয়েছে (একটি বাক্যে বিষয় এবং ক্রিয়া ক্রমটি স্যুইচ করুন)।

সুতরাং, আপনার কোড এটি [x+1 for x in l if x >= 45]করে:

for x in l:
    if x >= 45:
        x+1

যাইহোক, এই কোডটি এটি [x+1 if x >= 45 else x+5 for x in l]করে (পুনরায় ব্যবস্থা করার পরে expression):

for x in l:
    if x>=45: x+1
    else: x+5

0

যদি / তারপরে / অন্য কিছু হয় তবে সেখানে টের্নারি করার প্রয়োজন নেই। আমার মতে আপনার প্রশ্নটি এই উত্তরটির জন্য ডাকে:

row = [unicode((x or '').strip()) for x in row]

0

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

প্রশ্নের সুনির্দিষ্ট উত্তর দেওয়ার চেয়ে প্রথমে সমস্ত সম্ভাব্য ফর্মকে সাধারণীকরণ করা ভাল বলে মনে হয়। অন্যথায়, পাঠক উত্তরটি কীভাবে নির্ধারণ করা হয়েছিল তা জানতে পারবেন না। চূড়ান্তভাবে অন্য কোনও 'ধারাটি শেষ ফর্মে ব্যবহার করা যেতে পারে কিনা তা স্থির করার চেষ্টা করে মাথা ব্যথা হওয়ার আগে আমি ভেবেছিলাম এমন কয়েকটি সাধারণ রূপ রয়েছে যা আমি ভেবেছিলাম।

[expression1(item)                                        for item in iterable]

[expression1(item) if conditional1                        for item in iterable]

[expression1(item) if conditional1 else expression2(item) for item in iterable]

[expression1(item) if conditional1 else expression2(item) for item in iterable if conditional2]

itemশর্তাধীন কোনও অনুচ্ছেদে কোনও মান ব্যবহার করার দরকার নেই। একজন conditional3পারেন যোগ করার জন্য একটি সুইচ হিসেবে ব্যবহার করা যাবে অথবা আউটপুট তালিকায় একটি মান নয় যোগ করুন।

উদাহরণস্বরূপ, একটি নতুন তালিকা তৈরি করা যা খালি স্ট্রিংগুলি বা হোয়াইটস্পেসের স্ট্রিংগুলি মূল স্ট্রিংয়ের তালিকা থেকে বাদ দেয়:

newlist = [s for s in firstlist if s.strip()]

1
টিম তার মন্তব্যে উত্তর দেওয়ার সাথে সাথে দ্বিতীয়টি ত্রুটি দেয় , অজগর ডক্সে শর্তাধীন বিবৃতিও দেখুন । যা আমার কাছে বেশ অপঠনযোগ্য। সংক্ষিপ্তসার: কেবল this if condition else thatবা একটি সাধারণ অভিব্যক্তি অনুমোদিত। না value = this if condition(যা দিয়ে অর্জন করা যায় value = this if condition else None)
অ্যান্ডেরিয়াম

0

আপনি একটি বোঝার মধ্যে শর্তযুক্ত যুক্তি একত্রিত করতে পারেন:

 ps = PorterStemmer()
 stop_words_english = stopwords.words('english')
 best = sorted(word_scores.items(), key=lambda x: x[1], reverse=True)[:10000]
 bestwords = set([w for w, s in best])


 def best_word_feats(words):
   return dict([(word, True) for word in words if word in bestwords])

 # with stemmer
 def best_word_feats_stem(words):
   return dict([(ps.stem(word), True) for word in words if word in bestwords])

 # with stemmer and not stopwords
 def best_word_feats_stem_stop(words):
   return dict([(ps.stem(word), True) for word in words if word in bestwords and word not in stop_words_english])

-2
# coding=utf-8

def my_function_get_list():
    my_list = [0, 1, 2, 3, 4, 5]

    # You may use map() to convert each item in the list to a string, 
    # and then join them to print my_list

    print("Affichage de my_list [{0}]".format(', '.join(map(str, my_list))))

    return my_list


my_result_list = [
   (
       number_in_my_list + 4,  # Condition is False : append number_in_my_list + 4 in my_result_list
       number_in_my_list * 2  # Condition is True : append number_in_my_list * 2 in my_result_list
   )

   [number_in_my_list % 2 == 0]  # [Condition] If the number in my list is even

   for number_in_my_list in my_function_get_list()  # For each number in my list
]

print("Affichage de my_result_list [{0}]".format(', '.join(map(str, my_result_list))))

(ভেনভ) y অজগর
তালিকা_কম্প.পিএফিজেজ ডি মাই_লিস্ট [0, 1, 2, 3, 4, 5]
আফিহেগ দে মাই_সাল্ট_লিস্ট [0, 5, 4, 7, 8, 9]

সুতরাং, আপনার জন্য: row = [('', unicode(x.strip()))[x is not None] for x in row]


কী "Affichage ডি ..." মানে? এটা কি ফরাসী?
পিটার মর্টেনসেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.