我知道这与其他几个问题非常相似,但我无法让这个功能正常工作。
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]]
答案 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