转换为语句到列表

2024-10-02 20:35:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个循环

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]

Tags: in列表foriftypeelsell语法错误
2条回答

由于要添加另一个函数的所有结果(需要循环)添加x本身,因此需要添加另一个具有条件iterable源的循环:

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)

列表理解中的if仅用作筛选器,如下所示:

[something for element in sequence if condition]

然后将该条件用作过滤器,从序列中过滤出不符合该条件的所有元素。你知道吗

如果要根据list元素更改列表中的项目,则需要调整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

相关问题 更多 >