使用不可迭代的列表元素将列表列表分解为单个列表

时间:2011-06-27 20:38:16

标签: python

价:    python decompose a list    Flattening a shallow list in Python

虽然上面提到的解决方案很有帮助,但我的问题略有不同,我想知道是否有一种pythonic方法来解决它。

a = [['a-3','b-3'],'r',['j']]

我想要的是一种让'a'等于以下内容的简洁方法:

a = ['a-3','b-3','r','j']

我被困在使用python 2.4所以2.4兼容的pythonic解决方案会很棒,但我仍然会发现2.7个以上的例子很有趣。

主要问题是存在不可迭代的元素,否则sum(lst,[])的效果非常好,2.7 +的链式方法

5 个答案:

答案 0 :(得分:5)

Pythonic解决方案可能意味着许多事情。考虑到readability counts(PEP 20),这是我对该主题的贡献:

def dec(input_, output_):
    if type(input_) is list:
        for subitem in input_:
            dec(subitem, output_)
    else:
        output_.append(input_)

示例:

input_ = [['a-3','b-3', ['x','hello', ['3','b']]],'r',['j']]
output_ = ['a-3', 'b-3', 'x', 'hello', '3', 'b', 'r', 'j']

答案 1 :(得分:2)

怎么样:

itertools.chain.from_iterable(map(lambda i: i if type(i) == list else [i], a))

或者,为了便于阅读:

def assure_is_list(a):
   return a if type(a) == list else [a]

itertools.chain.from_iterable(map(assure_is_list, a))

答案 2 :(得分:1)

def flatten(L):
    if not L:
        return L
    elif type(L[0]) == type([]):
        return flatten(L[0]) + flatten(L[1:])
    else:
        return [L[0]] + flatten(L[1:])

希望这有帮助

答案 3 :(得分:0)

任何可迭代类型的递归展平,除了单独留下字符串(因为你可能不想将它们分成字符):

def flatten(x):
  try:
    if isinstance(x, basestring): raise TypeError
    y = iter(x)
  except TypeError:
    yield x
    return
  for item in y:
    for subitem in flatten(item):
      yield subitem

答案 4 :(得分:0)

认为你也可以使用这样的东西:

data = [['a-3','b-3', ['x','hello', ['3','b']]],'r',['j']]

while not all(not isinstance(x, list) for x in data):
    for i in xrange(len(data)):
        value = data.pop(i)
        if isinstance(value, list):
            data.extend(value)    
        else:
            data.append(value)