List Comprehension For Loop + Ternary Operation For Loop?
list, list-comprehension, python, syntax
Solution
You don't need any conditional expression* here, as `str.split()` always returns a list, even if only containing one word:
lst[:] = [word for words in lst for word in words.split()]
Demo:
>>> lst = ['word','word','multiple words','word']
>>> [word for words in lst for word in words.split()]
['word', 'word', 'multiple', 'words', 'word']
The conditional expression can be used wherever you could use a simple expression in the syntax; that means anywhere it says `expression` or `old_expression` in the list display grammar:
list_display ::= "[" [expression_list | list_comprehension] "]"
list_comprehension ::= expression list_for
list_for ::= "for" target_list "in" old_expression_list [list_iter]
old_expression_list ::= old_expression [("," old_expression)+ [","]]
old_expression ::= or_test | old_lambda_expr
list_iter ::= list_for | list_if
list_if ::= "if" old_expression [list_iter]
So the first part of a list comprehension, but also the part that produces the outermost iterator (evaluated once), the `if` expressions, or any of the nested iterators (evaluated each iteration of the next outer `for` loop).
*It's called the conditional expression; it is a ternary operator, but so is the SQL `BETWEEN` operator.
Problem
I think I understand list comprehensions and ternary operation, and I understand that I can combine the two, as seen here. My question involves combining the two expressions within one list comprehension. For instance, if I have the following list: ``` lst = ['word','word','multiple words','word'] ``` and I want to modify that list in one line, is there a way of doing so? I tried what I thought was the most obvious construction: ``` lst[:] = [word for word in word.split() if ' ' in word else word for word in lst] ``` That throws a syntax error. Is there a way of doing this in one line?