列表理解的意外输出

Edw*_*rlo 4 python list-comprehension list python-3.x

我有一个输入列表如下:

test_list = ['a', ('abc', 'd'), ['efgh', 'i'], 'jkl']
Run Code Online (Sandbox Code Playgroud)

我需要展平,所以摆脱元组和列表作为相应的第二和第三元素 test_list

预期产量:

['a', 'abc', 'd', 'efgh', 'i', 'jkl']
Run Code Online (Sandbox Code Playgroud)

我在找到正确的列表理解方面遇到了问题.我试过以下两个例子:

result = [xs if type(xs) is str else x for xs in test_list for x in xs]
print('result', result) 
# this outputs:
# ['a', 'abc', 'd', 'efgh', 'i', 'jkl', 'jkl', 'jkl']

result = [x if ((type(xs) is list) or (type(xs) is tuple)) else xs for xs in test_list for x in xs]
print('result',result)
#this also outputs:
# ['a', 'abc', 'd', 'efgh', 'i', 'jkl', 'jkl', 'jkl']  
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它确实"展平"了列表,但它会根据最后一个元素中的字符数重复最后一个元素.例如,如果的最后一个元素test_list'jklm'则在result最后一个元素被重复4次.

我想知道是否有一个列表理解将我的输入列表展平到预期的输出而不重复最后一个元素.

sch*_*ggl 7

以下嵌套理解将起作用:

[x for sub in test_list for x in (sub if isinstance(sub, (list, tuple)) else [sub])]
Run Code Online (Sandbox Code Playgroud)

这种用途isinstance应该优先于,type(...)并且可以给出多种类型.如果任何顶级元素不是列表或元组,则它将包含在列表中.