if/else in a list comprehension

后端 未结 11 786
一个人的身影
一个人的身影 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:13

    The specific problem has already been solved in previous answers, so I will address the general idea of using conditionals inside list comprehensions.

    Here is an example that shows how conditionals can be written inside a list comprehension:

    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
    

    Note that in the first list comprehension for X_non_str, the order is:

    expression for item in iterable if condition

    and in the last list comprehension for X_str_changed, the order is:

    expression1 if condition else expression2 for item in iterable

    I always find it hard to remember that expression1 has to be before if and expression2 has to be after else. My head wants both to be either before or after.

    I guess it is designed like that because it resembles normal language, e.g. "I want to stay inside if it rains, else I want to go outside"

    In plain English the two types of list comprehensions mentioned above could be stated as:

    With only if:

    extract_apple for apple in apple_box if apple_is_ripe

    and with if/else

    mark_apple if apple_is_ripe else leave_it_unmarked for apple in apple_box

提交回复
热议问题