python - 列表理解的意外输出

标签 python python-3.x list list-comprehension

我有一个输入列表如下:

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/

相关文章:

c++ - libconfig 读取列表 C

android - 列出将 >10 个改造调用与 rxjava2 组合在一起的子类型转换

c# - 如何在获取 IEnumerable 之前对对象使用 list.where 函数

Python - 动态更改参数数量

python - 将字节写入文件,编码错误

python - 将函数传递给多处理池中的 map 或星图

python - 在 Python 3 中使用 dbm 模块

Python:防止文件输入添加换行符

python - 将 Cloudfront 与 Django S3Boto 一起使用

python - "pip install Django"给出异常