将args转换为平面列表?

时间:2010-03-29 06:48:40

标签: python list

我知道这与其他几个问题非常相似,但我无法让这个功能正常工作。

def flatten(*args):
    return list(item for iterable in args for item in iterable)

我正在寻找的输出是:

flatten(1) -> [1]
flatten(1,[2]) -> [1, 2]
flatten([1,[2]]) -> [1, 2]

我从另一个SO答案中获取的当前函数似乎根本没有产生正确的结果:

>>> flatten([1,[2]])
[1, [2]]

4 个答案:

答案 0 :(得分:6)

要获得快速解决方案,只需使用第二个功能并使其递归。

def flatten(*args):
    output = []
    for arg in args:
        if hasattr(arg, '__iter__'):
            output.extend(flatten(*arg))
        else:
            output.append(arg)
    return output

答案 1 :(得分:4)

如果你想展平任意嵌套列表,你需要一个递归函数:

def flatten(ls):
  if isinstance(ls, list):
     return [fa for a in ls for fa in flatten(a)]
  else:
     return [ls]

(如果你希望扁平化大型结构,可以通过使用生成器而不是返回列表来提高效率。)

此函数也可以重复使用以创建一个带有多个参数的函数:

def pflatten(*ls):
   return flatten(list(ls))

答案 2 :(得分:1)

在展平字典时检查 __ iter __ 存在可能会非常奇怪:

>>> def flatten(*args):
...     output = []
...     for arg in args:
...         if hasattr(arg, '__iter__'):
...             output.extend(flatten(*arg))
...         else:
...             output.append(arg)
...     return output
...
>>> adict = {1:2, 3:4, 5:6}
>>> blist = ['a', 'b', 'c']
>>> raw = [adict, blist]
>>> flatten(raw)
[1, 3, 5, 'a', 'b', 'c']

我认为flatten只适用于列表和元组:

import types

def flatten(*args):
    output = []
    for arg in args:
        if isinstance(arg, (types.ListType, types.TupleType)):
            output.extend(flatten(*list(arg)))
        else:
            output.append(arg)
    return output

adict = {1:2, 3:4, 5:6}
blist = ['a', 'b', 'c']
raw = [adict, blist]
print flatten(raw)

答案 3 :(得分:-1)

解决了......

def flatlist(*args):
    lst = []
    for a in args:
        if hasattr(a, '__iter__'): lst.extend(flatlist(*a))
        else: lst.append(a)
    return lst