我有循环
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]
答案 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