अगर / किसी सूची की समझ में नहीं है


901

मैं पायथन में निम्नलिखित कैसे कर सकता हूं?

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

अनिवार्य रूप से:

  1. सभी तारों को खाली तारों से बदलें, और फिर
  2. एक समारोह के लिए बाहर ले जाने के लिए।

जवाबों:


1454

आप पूरी तरह से ऐसा कर सकते हैं। यह सिर्फ एक आदेश देने वाला मुद्दा है:

[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
अजगर डॉक्स त्रिगुट ऑपरेटर का उल्लेख । ध्यान दें कि इसे अन्य की आवश्यकता है, या यह काम नहीं करता है।
n

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एस स्टेटमेंट ब्लॉक में अभिव्यक्ति या कोड से संभावित अपवादों को संभालना पड़ता है । सरल मामलों के लिए स्वीकृत उत्तर बेहतर है।
21

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, आदेश है:

अभिव्यक्ति 1 अगर स्थिति iterable में आइटम के लिए और अभिव्यक्ति 2

मैं हमेशा यह मुश्किल है कि याद करने के लिए लगता है 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))))

(venv) $ python list_comp.py Affichage
de my_list [0, 1, 2, 3, 4, 5]
Affichage de my_result_list [0, 5, 4, 7, 8, 9]

तो, आपके लिए: row = [('', unicode(x.strip()))[x is not None] for x in row]


क्या करता है "AFFICHAGE डे ..." क्या मतलब है? क्या यह फ्रेंच है?
पीटर मोर्टेंसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.