python:扁平化列表



我知道之前有人问过这个问题,但是当有该类型的列表时,我没有看到任何解决方案:

original_list = [[1,2], [3], [4,5,[6

]]]尝试了这种方法:

def flatten(list):
"""Given a list that contains elements and other lists, this
will return a new list that has no sublists ("flattened")"""
flat = [] # new empty list to populate with flattened list
for sublist in list: # iterate through list elements
for element in sublist: #
flat.append(element)
return flat
print(flatten([1,2,3]))

这个方法也是:

old_list = [[1,2], [3], [4,5,[6]]]
flat1 = []
flat1 = [sum(old_list, [])] # 1 layer deep
flat2 = []
flat2 = [sum(flat1), []] # 2 layers deep
print(sort2)

没有任何运气...技巧?谢谢!

类似的东西?

In [6]: original_list = [[1,2], [3], [4,5,[6]]]                                                                                                                         
In [7]: def flatten(potential_list): 
...:     new_list = [] 
...:     for e in potential_list: 
...:         if isinstance(e, list): 
...:             new_list.extend(flatten(e)) 
...:         else: 
...:             new_list.append(e) 
...:     return new_list 
...:                                                                                                                                                                 
In [8]: flatten(original_list)                                                                                                                                          
Out[8]: [1, 2, 3, 4, 5, 6]

如果您有嵌套嵌套的列表,最好的扁平化方法是使用生成器函数

original_list = [[1,2], [3], [4,5,[6]]]
def flatten(l):
for i in l:
if isinstance(i,list):
yield from flatten(i)
else:
yield i
list(flatten(original_list))
#[1, 2, 3, 4, 5, 6]

您可以使用Collections.Iterable

In [2810]: def flatten(x): 
...:     if isinstance(x, collections.Iterable): 
...:         return [a for i in x for a in flatten(i)] 
...:     else: 
...:         return [x] 
...: 
In [2811]: flatten(original_list)
Out[2811]: [1, 2, 3, 4, 5, 6]

或者像这样的蛮力:

In [2803]: flat_list = [] 
...: for sublist in original_list:
...:     for item in sublist: 
...:         if isinstance(item,list): 
...:             for sub_item in item: 
...:                 flat_list.append(sub_item) 
...:         else: 
...:             flat_list.append(item)
In [2804]: flat_list 
Out[2804]: [1, 2, 3, 4, 5, 6]

这是一个递归解决方案:

def recursive_flatten(lst, retlist = []):
for item in lst:
if type(item) is int:
retlist.append(item)
else:
recursive_flatten(item, retlist)
return(retlist)

最新更新