2015-08-20 80 views
0

我有循環轉換爲語句列表理解

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] 

回答

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) 
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