在Python中展平可变深度列表

时间:2017-11-09 17:23:23

标签: python list list-comprehension

我有n个列表的列表。每个内部列表包含(a)字符串,(b)空列表或(c)包含一个字符串的列表的组合。我想转换内部列表,以便它们只包含字符串。

我有一个这样的列表,例如:

[[[],["a"],"a"],[["ab"],[],"abc"]]

我希望它是这样的:

[["","a","a"],["ab","","abc"]]

我知道我可能会经历一个循环,但我正在寻找一个更优雅的解决方案,最好是列表理解。

5 个答案:

答案 0 :(得分:1)

列表理解:

>>> original = [[[],["a"],"a"],[["ab"],[],"abc"]]
>>> result = [['' if not item else ''.join(item) for item in sublist] for sublist in original]
>>> result
[['', 'a', 'a'], ['ab', '', 'abc']]

答案 1 :(得分:1)

由于您想要展平的列表中的每个元素都是可迭代的,而不是检查某个类的实例(列表,字符串),您实际上可以使用duck-typing:

Boxa*

或更易阅读的版本:

>> my_list = [[[],["a"],"a"],[["ab"],[],"abc"]]
>> [list(map(lambda x: ''.join(x), elem)) for elem in my_list]

结果:

result = []
for elem in my_list:
    flatten = map(lambda x: ''.join(x), elem)
    result.append(list(flatten))

不检查什么是什么,而是利用转换机制来适应每个结构的自适应能力,这是相当pythonic。

答案 2 :(得分:0)

 original_list = [[[],["a"],"a"],[["ab"],[],"abc"]]
 flatten = lambda x: "" if x == [] else x[0] if isinstance(x, list) else x
 flattened_list = [[flatten(i) for i in j] for j in original_list]

答案 3 :(得分:0)

通过列表理解:

lst = [[[],["a"],"a"],[["ab"],[],"abc"]]
result = [ ['' if not v else (v[0] if isinstance(v, list) else v) for v in sub_l] 
           for sub_l in lst ]

print(result)

输出:

[['', 'a', 'a'], ['ab', '', 'abc']]

答案 4 :(得分:0)

我不确定这是否是您想要的,但您可以尝试对原始列表中的每个列表使用递归解决方案。这是函数的代码。

def flatten(aList):
    if aList == []:
        return [""]
    if type(aList[0]) is list:
        return flatten(aList[0])+flatten(aList[1:]) if len(aList)>1 else flatten(aList[0])
    return aList[:1]+flatten(aList[1:]) if len(aList)>1 else aList[:]