if/else in a list comprehension

后端 未结 11 773
一个人的身影
一个人的身影 2020-11-21 11:44

How can I do the following in Python?

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

Essentially:

  1. replace
相关标签:
11条回答
  • 2020-11-21 12:19

    The other solutions are great for a single if / else construct. However, ternary statements within list comprehensions are arguably difficult to read.

    Using a function aids readability, but such a solution is difficult to extend or adapt in a workflow where the mapping is an input. A dictionary can alleviate these concerns:

    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', '']
    
    0 讨论(0)
  • 2020-11-21 12:20

    Here is another illustrative example:

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

    It exploits the fact that if i evaluates to False for 0 and to True for all other values generated by the function range(). Therefore the list comprehension evaluates as follows:

    >>> ["ha" if i else "Ha" for i in range(3)]
    ['Ha', 'ha', 'ha']
    
    0 讨论(0)
  • 2020-11-21 12:22

    There isn't any need for ternary if/then/else. In my opinion your question calls for this answer:

    row = [unicode((x or '').strip()) for x in row]
    
    0 讨论(0)
  • 2020-11-21 12:26

    You can combine conditional logic in a comprehension:

     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])
    
    0 讨论(0)
  • 2020-11-21 12:26
    # 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]

    So, for you: row = [('', unicode(x.strip()))[x is not None] for x in row]

    0 讨论(0)
提交回复
热议问题