我有一个输入列表如下:
test_list = ['a', ('abc', 'd'), ['efgh', 'i'], 'jkl']
我需要将其展平,因此摆脱元组和列表分别作为 test_list
的第二个和第三个元素
预期输出:
['a', 'abc', 'd', 'efgh', 'i', 'jkl']
我在为此找到正确的列表理解时遇到问题。 我试过以下两个例子:
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']
如您所见,它确实“展平”了列表,但它根据最后一个元素中的字符数重复了最后一个元素。例如,如果 test_list
的最后一个元素是 'jklm'
,那么在 result
中,最后一个元素重复 4 次。
我想知道是否有一个列表推导式可以在不重复最后一个元素的情况下将我的输入列表展平为预期的输出。
最佳答案
下面的嵌套理解将起作用:
[x for sub in test_list for x in (sub if isinstance(sub, (list, tuple)) else [sub])]
这使用 isinstance
应该优先于 type(...)
并且可以被赋予多种类型。如果任何顶级元素不是列表或元组,则将其包装在列表中。
关于python - 列表理解的意外输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48063772/