python:展平到列表列表但不多了

时间:2014-12-26 03:00:17

标签: python

我有一个列表列表,这些列表嵌套在多个列表层中。

可能的输入:

[[[[1,2,3] , [a,b,c]]]][[[1,2,3] , [a,b,c]]][[[1,2,3]] , [[a,b,c]]]

当我使用flat()时,它会将所有不符合我想要的东西弄平。

[1,2,3,a,b,c]

我需要的是

[[1,2,3] , [a,b,c]]

作为最终输出。

我的平面定义低于

def flat(S):
    if S == []:
        return S
    if isinstance(S[0], list):
        return flat(S[0]) + flat(S[1:])
    return S[:1] + flat(S[1:])

3 个答案:

答案 0 :(得分:7)

import collections
def is_listlike(x):
    return isinstance(x, collections.Iterable) and not isinstance(x, basestring)

def flat(S):
    result = []
    for item in S:
        if is_listlike(item) and len(item) > 0 and not is_listlike(item[0]):
            result.append(item)
        else:
            result.extend(flat(item))
    return result

tests = [ [[[[1,2,3] , ['a','b','c']]]],
          [[[1,2,3] , ['a','b','c']]],
          [[[1,2,3]] , [['a','b','c']]] ]

for S in tests:
    print(flat(S))

产量

[[1, 2, 3], ['a', 'b', 'c']]
[[1, 2, 3], ['a', 'b', 'c']]
[[1, 2, 3], ['a', 'b', 'c']]

答案 1 :(得分:2)

更换:

if S == []:
    return S

使用:

if (not any([isinstance(x,list) for x in S])) :
    return [] if S==[] else [S]

似乎可以解决问题。

或者:

if S == []:
    return S
if (not any([isinstance(x,list) for x in S])) :
    return [S]

我看到了两个要求 - 检测S何时不应该被展平,然后返回一个在与其余部分结合时不会变平的值(即加入append而不是extend)。我的猜测是,非列表元素列表不应该被压平。

我和unutbu一样吠叫同一棵树,但是更加混乱。:)

答案 2 :(得分:0)

flat()可能会变成

def flat(mylist):
    return[val for sublist in mylist for val in sublist]

然后你可以在像这样的for循环中调用它

while type(mylist[0][0]) is list:
    mylist = flat(my list)

并且无论嵌套列表的数量是多少,它都会将其减少到所需的输出

[[1, 2, 3], ['a', 'b', 'c']]