我有循環轉換爲語句列表理解
ll = []
for x in l:
if type(x) == str:
for y in expandStr(x):
ll.append(y)
else:
ll.append(x)
螞蟻把它轉換成列表解析,卻得到了一個語法錯誤
ll = [y for x in expandStr(x) if type(x) == str else x for x in l]
我有循環轉換爲語句列表理解
ll = []
for x in l:
if type(x) == str:
for y in expandStr(x):
ll.append(y)
else:
ll.append(x)
螞蟻把它轉換成列表解析,卻得到了一個語法錯誤
ll = [y for x in expandStr(x) if type(x) == str else x for x in l]
既然你要麼附加其它功能的所有結果(需要一個循環)或加入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)
的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