将语句转换为列表理解

时间:2015-08-20 18:53:18

标签: python python-3.x list-comprehension

我有循环

ll = []
for x in l:
    if type(x) == str:
        for y in expandStr(x):
            ll.append(y)
    else:
        ll.append(x)

ant将其转换为列表理解,但得到语法错误

ll = [y for x in expandStr(x) if type(x) == str else x for x in l]

2 个答案:

答案 0 :(得分:1)

由于您要么添加另一个函数的所有结果(需要循环)添加x本身,您需要添加另一个带有条件可迭代源的循环:

ll = [value for x in l for value in (expandStr(x) if isinstance(x, str) else (x,))]

因此,如果x不是字符串,则代码使用单元素元组作为嵌套循环的循环源。没有列表理解,看起来像:

ll = []
for x in l:
    nested_source = expandStr(x) if isinstance(x, str) else (x,)
    for y in nested_source:
        ll.append(y)

答案 1 :(得分:0)

列表推导中的if仅用作过滤器,如下所示:

[something for element in sequence if condition]

然后将该条件用作过滤器,以过滤掉不符合该条件的序列中的所有元素。

如果要根据列表元素更改列表中的项目,则需要调整something表达式。在这里,您可以使用三元表达式语法:

something if condition else something_else

在您的情况下,您希望添加一个元素,或按列表扩展元素。这是不可能的直接,因此您必须选择一个始终按元素列表扩展的共同点。所以你必须将一个元素放入一个元素列表中,然后再循环通过:

[ y for x in l for y in (expandStr(x) if isinstance(x, str) else [x]) ]
#   ^^^^^^^^^^
#   loop through the elements in l
#
#                        ^^^^^^^^^^^^                            ^^^
#                        if x is a string, use the sequence that `expandStr` returns;
#                        otherwise just use a 1-element list with the original value
#
#              ^^^^^
#              loop through the sequence that is returned by the ternary expression
#
# ^
# and place that in the final result list