假设我的列表是:
[ [1,2,3,4], [ [[5], [6]], [7] ]]
解压后,我想获得[1,2,3,4], [5], [6], [7]
如何以较低的时间复杂度做到这一点?
答案 0 :(得分:3)
linked duplicate完全展平了一个迭代。您只需稍微调整即可使流程提前一步停止:
import collections
def flattish(l):
for el in l:
if isinstance(el, collections.Iterable) and not isinstance(el, str):
if any(isinstance(e, collections.Iterable) for e in el):
for sub in flattish(el):
yield sub
else:
yield el
else:
yield [el]
any(...
将检查该iterable是否包含任何迭代。这会使[1, [2, 3]]
之类的内容变得扁平化,但会保留[5]
。此外,yield [el]
确保任何非迭代都将包含在list
中,因此您的结果将是仅包含list
的{{1}},其中一些可能只有一个元素。
答案 1 :(得分:2)
使用正则表达式的另一种方式:
>>> import re
>>> x = [[1, 2, 3, 4], [[[5], [6]], [7]]]
>>> eval(re.sub(r'([][])\1+', '\\1', str(x)))
([1, 2, 3, 4], [5], [6], [7])
@ TigerhawkT3对这个x
的答案更快,每个循环28.9μs对每个循环41.8μs
所以只是为了好玩
import json
json.loads(re.sub(r'([][])\1+', '\\1', str(x)))
将正则表达式恢复到每个循环22.1μs
答案 2 :(得分:0)
您可以尝试使用re
。
import re
x=[ [1,2,3,4], [ [[5], [6]], [7] ]]
print map(lambda x:map(int,re.findall(r"\d+(?=.*\])",x)),re.findall(r"\[[^\[\]]*\]",str(x)))
输出:[[1, 2, 3, 4], [5], [6], [7]]
答案 3 :(得分:0)
您可以尝试:
>>> final_list = []
>>> def make_single(input_list):
final_list_inside = []
for i in input_list:
if any(isinstance(el, list) for el in input_list):
make_single(i)
else:
final_list_inside.append(i)
if(len(final_list_inside) != 0):
final_list.append(final_list_inside)
>>> make_single([[1, 2, 3, 4], [[[5], [6]], [7]]])
>>> final_list
[[1, 2, 3, 4], [5], [6], [7]]
答案 4 :(得分:0)
您可以递归检查好的列表:好的列表是那些不包含列表的列表。每个列表仅访问一次。
def prettyflat(ll):
pf=[]
def good(ll):
isgood = isinstance(ll,list) and all([not good(l) for l in ll])
if isgood : u.append(ll)
return isgood
good(ll)
return pf
输出:[[1, 2, 3, 4], [5], [6], [7]]