def flattenList(toFlatten):
final=[]
for el in toFlatten:
if isinstance(el, list):
final.extend(flattenList(el))
else:
final.append(el)
return final
Run Code Online (Sandbox Code Playgroud)
当我不知道列表的嵌套程度时,这是我能想到的唯一方法.
你应该避免在Python中进行类型检查.在这种情况下,这意味着避免任意嵌套的结构,您可以按类型区分.你可以建立您可以通过以下方法遍历自己的节点类型等比类型检查,就像是在看一个特定的属性.
对于展平一个级别或正好n个级别,请查看itertools.chain.from_iterable.
我不知道你的意思是"功能性".这段代码非常实用:它使用递归(不是它的功劳!)并且它不会改变它的参数.(严格地说,它确实使用可变状态来构建列表,但这就是你在Python中如何做到这一点.
我想一个更多的功能属性是懒惰的评估.你可以这样实现
def flatten(toFlatten):
for item in toFlatten:
if isinstance(item, list): # Ewww, typchecking
for subitem in flatten(item): # they are considering adding
yield subitem # "yield from" to the language
# to give this pattern syntax
else:
yield item
Run Code Online (Sandbox Code Playgroud)递归在Python中非常有限(至少在所有主要实现中都是如此),并且通常应该避免任意深度.很有可能重写这个(以及所有递归代码)来使用迭代,这将使它更具可扩展性(并且功能更少,这在Python中是一件好事,它不是特别适合FP.)
小智 1
这是另一种选择(尽管可能有比类型检查更干净的东西,例如测试某些东西是否可迭代,因此不是“原子”):
def flatten(lst):
if not isinstance(lst,list):
return [lst]
else:
return reduce(lambda x,y:x+y,[flatten(x) for x in lst],[])
Run Code Online (Sandbox Code Playgroud)
它基于类似计划的东西。
| 归档时间: |
|
| 查看次数: |
360 次 |
| 最近记录: |